Вызов метода ViewController из подпредставления его представления? - PullRequest
0 голосов
/ 03 апреля 2012

Я работаю над проектом после моего бывшего коллеги.Код был великолепен, за исключением одного:

Главный контроллер

@interface MainController : UIViewController {

}

@property (nonatomic, strong) IBOutlet HeaderBar *headerBar;

- (void)setup;
- (IBAction)refreshHeader;

@end


@implementation MainController 

- (void)setup{
    HeaderBar *hb = [[HeaderBar alloc] initWithNibNames:@"HeaderBar"];
    self.headerBar = hb;
}

- (IBAction)refreshHeader {
    //Do something with headerBar's properties
    //For example, [self.headerBar someiVar];
}

Затем есть кнопка в качестве подпредставления представления HeaderBar.Эта кнопка была связана с методом FirstResponder , который выглядит как refreshHeader

Код работает нормально, как он хотел.Но даже я новичок в разработке для iOS и пока не совсем понимаю, что такое FirstResponder.Я не чувствую себя хорошо с этим подходом к дизайну.

Так как эта кнопка принадлежит представлению headerBar.Он должен быть привязан к методу headerBar, верно?(предположим, что headerBar также является контроллером) Затем найдите способ отправить данные / результат / сообщение из headerBar в MainController вместо прямой отправки в MainController с помощью firstResponder.

Если это так, как я могуотправлять данные / результат / сообщение одному из методов MainController из метода HeaderBar вместо того, чтобы использовать подход, который появился в другой части кода.(Что мне тоже не нравится в этом вопросе, это выглядит странно. Похоже, неправильно создать связь между двумя контроллерами.)

Главный контроллер

- (void)anotherSetup{
    FooterBar *fb = [[FooterBar alloc] initWithNibNames:@"FooterBar"];
    fb.mainController = self;
    self.footerBar = fb;
}

FooterBar

#import "MainController.h"

@interface FooterBar : UIViewController {

}

@property (nonatomic, strong) MainController *mainController;

- (void)someMethod;

@end

@implementation FooterBar
@synthesize mainController;

- (void)someMethod {
    [self.mainController someMainControllerMethod];
}

Я читал некоторые другие связанные вопросы, большинство из них сказали, что другой подход заключается в определении Protocal и Delegate , это таклучший способ сделать это?Это единственный способ?Вместо того, чтобы два контроллера общались друг с другом.

Любые предложения приветствуются, исправьте и мое недоразумение.Мне придется работать над этим проектом месяцами, а он только на втором этапе из пяти.Итак, я бы хотел иметь как можно меньше фальшивых дизайнов.

С наилучшими пожеланиями

PS Извините, если код неверный, это не настоящий код.Что-то может не исправить, но, надеюсь, вы, ребята, можете увидеть картинку.

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

вы можете использовать self.parentViewController это относится к viewController, который добавил текущий viewController

2 голосов
/ 03 апреля 2012

Да, это лучший способ сделать это. Это называется паттерном дизайна делегирования. И это на самом деле два контроллера, взаимодействующих друг с другом.

Единственная проблема, которую я вижу здесь, это то, что вы сохраняете MainController в FooterBar. Вы не должны этого делать, так как это приводит к сохранению цикла, который блокирует освобождение объектов (объект A сохраняет B, а obj B сохраняет A, поэтому их счет никогда не будет равен 0).

Таким образом, вместо того, чтобы иметь (в Footerbar):

@property (nonatomic, strong) MainController *mainController;

вы должны иметь:

@property (nonatomic, assign) MainController *mainController;

Или, чтобы быть более общим (при необходимости), вы можете создать протокол, описывающий необходимые методы для делегата. А затем заставьте MainController реализовать этот протокол.

//FooterBar.h
@protocol FooterBarDelegate <NSObject>

-(void)aNeededMethod;

@end
@interface FooterBar : UIViewController {

}

@property (nonatomic, assign) id<FooterBarDelegate> mainController;

- (void)someMethod;

@end

, а затем

//MainController.h
#import "FooterBar.h"
@interface MainController : UIViewController <FooterBarDelegate> {

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...