在TabBarController中包含的视图控制器之间传输数据时出现故障



这是我的第一个问题,我是编程领域的新手。我有一个选项卡栏控制器,我想将数据从FVC(第一视图控制器)传输到SVC(第二视图控制器)。在FVC中,我使用数组(VCArray)中选项卡栏控制器中包含的控制器,并将该数组的第二个对象分配给SVC实例,并使用FVC的适当数据设置SVC的属性,但这些属性在SVC中显示为零。

更有趣的是,当我检查被分配为VCArray的第二个对象的SVC实例时,[isOFKindClass SVC]和[isOFKindClass FVC]都实现了。。这怎么可能?一个对象可以有两个类?如果我检查[isOfKIndClass NSArray],它会变为false。。这意味着在执行过程中没有任何错误。

对不起,我的英语不好p

第1部分的答案是,您需要公开SVC上的属性,以便另一个类可以访问它们,并且FVC需要导入SVC的接口文件(.h)。因此,要做到这一点,您几乎总是需要两件事:找到要更改的类的方法,以及该类的接口。属性将如下所示:

SVC.h:
@property (nonatomic, strong) NSString *title;
- (void)doSomething;
FVC:
#import "SVC.h"
SVC *svc = ...; // get a reference to it
svc.title = @"Howdie!";
[svc doSomething]; // tell the class to use the title you just set, for example

要回答第二个问题,有两种类型的"is.."方法,isKindOfClass和isMemberOfClass。第一种说法是当前对象是所提供类的类型,或者ANY超类。只有当类实际上是一个精确的成员时,第二个才通过。例如:

NSMutableData *data;
[data isKindOfClass:[NSData class]] == YES
[data isKindOfClass:[NSMutableData class]] == YES
[data isMemeberOfClass:[NSData class]] == NO
[data isMemeberOfClass:[NSMutableData class]] == YES

编辑:所以数据永远不会进入SVC。试试这个吧——属性只是拥有ivar、getter(通常也是)setter的捷径。实际上,您可以提供自己的setter。所以你说(使用我上面的例子),SVC中的标题总是零,即使它是由SVC设置的。发生这种情况的原因只有三个:

  • FVC引用了另一个对象,但实际上您称之为SVC,所以当设置值时,它会设置为另一个类,而不是SVC

  • 当FVC设置值时,SVC是一个nil对象(ObjectiveC将消息处理为nil很好,所以您不会在控制台上看到任何错误)

  • SVC已在您不知情的情况下将值重置为零,例如查看WillAppear

因此,您可以找到的方法是覆盖变量setter(再次使用我的示例):

- (void)setTitle:(NSString *)val
{
  title = val; // ARC way
  NSLog(@"SVC - just set title to %@", title);
}

将其添加到SVC中,看看会发生什么。

最新更新