2011-04-27 85 views
0

我想知道是否有可能在从XIB文件加载的UIView中点击某处(或者执行其他操作),并从父XIB触发UIView的操作(如更改父UIView中的UIButton的标题)。这是代码NewsController类接口的一个片段:如何通过父XIB将UIView从XIB子通信到UIView?

#import <UIKit/UIKit.h> 
#import "NewsPage.h" 
@interface NewsController : UIViewController { 
    // Some objects 
    UIButton *loadButton; 
    UIView *newsView; 
    NewsPage *newsPage; 
} 
@property (nonatomic, retain) IBOutlet UIButton *loadButton; 
@property (nonatomic, retain) IBOutlet UIView *newsView; 
@property (nonatomic, retain) NewsPage *newsPage; 
@end 

,这是类实现NewsPage,我在那里加载子XIB的一个片段:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Some code 
    newsPage = [[NewsPage alloc] initWithNibName:@"NewsPage" bundle:nil]; 
    [newsView addSubview:newsPage.view]; 
    // Some other code 
} 

这是一个代码片段内部NewsPage类接口:

#import <UIKit/UIKit.h> 
#import "NewsController.h" 
@interface NewsPage : UIViewController { 
    NewsController *newsController; 
} 
@property (nonatomic, retain) IBOutlet NewsController *newsController; 
@end 

,这是类实现的片段

- (void)tapAction:(UIGestureRecognizer *)gestureRecognizer { 
    // Some code 
    NewsController *newsController = [[NewsController alloc] initWithNibName:@"News" bundle:nil]; 
    NSLog(@"Current button title is: %@\n", newsController.loadButton.titleLabel.text);   
    newsController.loadButton.titleLabel.text = @"New text goes here!"; 
    NSLog(@"Current button title is: %@\n", newsController.loadButton.titleLabel.text); 
    // Some other code 
} 

使用此代码(并在IB中进行一些布线后),我在调试器中看到正确的标题,但模拟器不更新标题更改。我的猜测是,孩子UIViews平行于母公司的UIViews,即使我做这样的事情:

[newsController.loadButton removeFromSuperview] 

没有在父母UIView的层次结构没有变化,因为孩子UIViews“是不是里面的”父UIView的。我希望有人能够帮助,因为这是非常令人沮丧的。提前,非常感谢。

+0

一些基本信息的链接是否XIB连接到所有者对象是否正确?这听起来像titleLabel不存在于视图的层次结构中。所以它不会被显示。 – AechoLiu 2011-04-27 22:57:27

+0

@Toro:是的,所有者对象已正确连接,但我不知道在父级UIView中加载的XIB对象是否属于父级的层次结构,如果是,为什么不更新从子UIView所做的任何更改父UIView。 – Raomon 2011-04-27 23:17:43

回答

0

我看到的一个问题是,您正在访问NewsController中的某些元素,可能尚未从NIB解压缩,因为当需要视图时,它们是懒惰地完成的。尝试访问控制器的.view成员,这应该强制加载,然后再引用这些项目。这是一个每个人似乎都会遇到的问题,直到懒惰的负载想法得到维护。

NewsController *newsController = [[NewsController alloc] initWithNibName:@"News" bundle:nil]; 
newController.view; //hopefully this doens't get optimized out. If so, change it a bit. 
NSLog(@"Current button title is: %@\n", newsController.loadButton.titleLabel.text); 
+0

谢谢@DavidNeiss的回答。我按照你的说法尝试,但没有任何改变。我甚至用'循环的(UIView的*鉴于[newsController.view子视图]){ \t \t如果(view.tag == 99){ \t \t \t \t \t \t的NSLog(@“输入标签#99尝试隐藏属性%d \ n“,newsController.loadButton。隐); \t \t \t [view removeFromSuperview]; (@“在新闻控制器中的UIView#%d \ n”,view.tag); \t}'似乎代码可以工作,但它在模拟器中还没有更新。 – Raomon 2011-04-27 22:54:11

+0

您是否正在使用 - (void)presentModalViewController转换到newsController模式视图:(UIViewController *)modalViewController animated:(BOOL)animated ? – DavidN 2011-04-27 23:07:25

+0

不,因为newsController不是模态视图,而是“主视图”。 NewsPage XIB加载在NewsController的UIView里面,在它里面点击并触发tapAction:gestureRecognizer。 – Raomon 2011-04-27 23:14:20

0

从本质上讲,当父母想知道的东西,孩子会告诉你,你对孩子的父母设定的委托,然后在子代码,你检查,看看是否能代表首先的存在,然后确保它响应您将发送的选择器。然后你发送一条消息。

通过使用@协议的

这里实现这个的一个好办法就是用它

http://iosdevelopertips.com/objective-c/the-basics-of-protocols-and-delegates.html