在我的mainViewController.h
我宣布了一个UIButton *myButton
,我在mainViewController.m
中合成了它。我还创建了一个只返回按钮的访问器方法(myButton)。在另一个视图(因此是一个不同的视图控制器类)我有:
mainViewController *mainVC = [[mainViewController alloc] init];
UIButton *myButton = [mainVC myButton];
[eventButton setTitle:@"New Title" forState:UIControlStateNormal];
我希望此代码更改按钮的标题标签,但它似乎不起作用。使用NSLog语句(NSLog(@"%@", myButton.titleLabel);
)查看当前标题是什么,它始终返回null。从我读过的,这是因为我正在创建一个mainViewController的实例,因此我实际上并没有访问/更改按钮。如何访问实际的视图控制器而不是实例?
答案 0 :(得分:2)
(在较长时间的讨论之前:看起来您在第3行输入myButton
第2行,在第3行输入eventButton
。确保这些匹配!)
您认为自己正在创建mainViewController
的新实例是正确的。为了得到你想要的那个,你需要在创建时将mainViewController
的引用传递给新的视图控制器,编写如下方法:
@synthesize mainViewController;
-(void) initWithMainVC:(MainViewController *)mainVC {
if ((self = [super init])) {
self.mainViewController = mainVC;
}
return self;
}
覆盖init
,或者,如果您在App Delegate中有mainViewController
的引用,则可以使用以下代码获取:
MainViewController *mainVC = [(YourAppDelegate *)[[UIApplication sharedApplication] delegate] mainViewController];
无论你选择哪种方式,你都会想要阅读面向对象的编程和目标C中的指针。当你调用alloc
时,你正在制作该类的新副本。所有副本都位于不同的内存块中,因此您创建的任何新副本(如上面的代码中所示)实际上是一个完全不同的实体,如两个Priuses,或者类似的东西。
指针就像一个名称标签,用于标识或指向该内存块。在上面的init
代码示例中,我们将新的名称标签附加到具有相同内容的mainViewController
实例。第二行也是一样 - 我们创建一个新指针(参见星号?)告诉它它将指向一个MainViewController
实例,然后将该名称标签或指针打到一个实例上。
(第二个稍微复杂一点,因为你从一个名为singleton的对象中提取mainViewController
,或者你可以从任何地方获取的对象...阅读更多关于这些和App的信息代表来自Cocoa的this post爱情。)
无论如何,我对Stack上的这些东西感到紧张!查看Apple的Objective C参考资料,了解更多基础知识。 iOS Dev Center上的示例代码非常非常适合查看。下载一个看起来不错的项目,或者更好的是,只需从Xcode模板创建一个项目,然后尝试弄清楚它是如何拼接在一起的。祝你好运!
答案 1 :(得分:0)
您需要了解的是,当您分配新的mainViewController *mainVc
时,您实际上正在创建视图控制器及其相关按钮的新实例,因此您只是更改按钮的标题而不是一个当前在你的屏幕上!
您可以根据@Sam Ritchie的建议传递对mainViewController的引用,也可以实现在准备更改按钮标题时调用的委托方法。
假设您有一个要在用户成功登录时更改为LOGOUT的LOGIN按钮,您可以在视图控制器中创建一个委托协议来处理登录逻辑并在视图控制器中实现它“拥有” “相关的UIButton,您可以直接更改按钮文本。