【问题标题】:I lose access to my IBOutlets when making view controller new detail view controller使视图控制器成为新的详细视图控制器时,我无法访问我的 IBOutlets
【发布时间】:2012-11-01 13:26:31
【问题描述】:

我有一个 iPad 主细节,其中主要细节控制器是导航控制器,并且根据选择的表行(在主视图控制器中),我可能会也可能不会替换由细节导航控制器管理的视图控制器。

这似乎工作正常,只是在进行此操作时我无法访问新的细节视图控制器的 IBOutlets。

这是我切换导航控制器的视图控制器:

CustomerDetailViewController *subview = [[CustomerDetailViewController alloc] initWithNibName:@"CustomerDetailViewController" bundle:nil];            
[subview setTitle:@"Testing"];
AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
app.splitViewController.delegate = subview;
[app.detailNavigationController setViewControllers:[NSArray arrayWithObjects:subview, nil]];
[subview setData:[custData objectForKey:@"name"]];

custData 是一个包含我的视图信息的 NSDictionary。这是 setData 命令:

- (void)setData:(NSDictionary *)cust {

    NSLog(@"%@\n", [cust valueForKey:@"name"]);
    self.nameLabel.text = [cust valueForKey:@"name"];
    NSLog(@"%@\n", self.nameLabel.text);
}

所以发生的事情是,子视图成为新的视图控制器,但标签没有改变 - 但是,这两个日志命令被执行。标签是使用 IB 合成和连接的,如果我将子视图推送为新的视图控制器而不是替换它,它就会起作用。

【问题讨论】:

    标签: objective-c ios uisplitviewcontroller iboutlet


    【解决方案1】:

    我会说,视图尚未初始化。插座首先在viewDidLoad 方法中连接。尝试在 viewDidLoad 中添加一条日志语句以找出首先调用哪个。

    如果在setData 方法之后调用viewDidLoad,则只能设置CustomerDetailViewController 的局部变量,然后由viewDidLoad 读取并相应地设置标签。

    【讨论】:

    • 你是对的 - viewDidLoad 发生在 setData 之后。但是,我在调用 setData 之前初始化该视图,并在调用 setData 之前将其分配为我的 detailViewController。关于视图何时加载的任何想法?此外 - 标题设置正确,因为它显示在 navigationViewController 上。
    • 无论如何 - 我已将 NSDictionary *cust 设置为实例变量,使用自定义初始化设置它,并根据您的建议在 viewDidLoad 中设置标签,一切都很好。干杯。
    • 我猜视图控制器的标题与UILabels 等其他 UI 元素的处理方式不同。实例化视图 controller 也与其 的加载分开视图(本质上是别的东西,参见 MVC 模式)
    • 是的,我认为构造函数名称 initWithNibName - 因为 nib 本质上是视图 - 让我误以为您正在同时用视图初始化控制器,但我猜 initWithNibName 只是在逻辑上将两者联系在一起,实际上并没有初始化视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多