Как передать UIView от дочернего элемента XIB в UIView от родительского XIB? - PullRequest
0 голосов
/ 28 апреля 2011

Я хотел бы знать, возможно ли где-то нажать (или сделать что-то еще) внутри UIView, загруженного из файла XIB, и вызвать действие UIView из родительского XIB (например, изменить заголовок UIButton в родительском UIView). Это фрагмент кода интерфейса класса NewsController:

#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. Я надеюсь, что кто-то может помочь с этим, потому что это очень расстраивает. Заранее большое спасибо.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2011

По сути, когда родитель хочет знать что-то, что скажет Ребенок, вы устанавливаете делегат на дочернем объекте как родительский, а затем в дочернем коде проверяете, существует ли этот делегат в первую очередь, и затем убедитесьон отвечает на селектор, который вы отправите.затем вы отправляете ему сообщение.

хороший способ реализовать это путем использования @ protocol's

Вот ссылка с некоторой базовой информацией об этом

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

0 голосов
/ 28 апреля 2011

Одна проблема, которую я вижу, заключается в том, что вы получаете доступ к некоторым элементам в 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);   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...