Здесь вводится шаблон делегирования. Если я не понял вас неправильно, вы хотите выполнить какое-либо действие (refresh ??) на UIViewController
на основе какого-либо действия в UIView
, которое, в свою очередь, является частью его собственной иерархии представлений.
Допустим, ваш пользовательский вид завернут в класс CustomView
. Он имеет метод с именем action
, который вызывается в какой-то момент. Более того, предположим, что вы использовали экземпляры CustomView
для некоторых контроллеров представления, а именно: MyViewController1
, MyViewController2
и т. Д., Как часть их иерархии представлений. Теперь вы хотите выполнить какое-либо действие (обновление) в своем VCS, когда метод action
запускается из ваших экземпляров CustomView
. Для этого вам нужно объявить протокол в файле заголовка вашего и ему придется зарегистрировать обработчик этого протокола (обычно называемый делегатом) экземпляру . Заголовочный файл будет выглядеть примерно так:
//CustomView.h
//your include headers...
@class CustomView;
@protocol CustomViewDelegate <NSObject>
-(void)customViewDidPerformAction:(CustomView*)customView;
@end
@interface CustomView : UIView {
//......... your ivars
id<CustomViewDelegate> _delegate;
}
//.......your properties
@property(nonatomic,weak) id<CustomViewDelegate> delegate;
-(void)action;
//....other declarations
@end
Теперь вы хотели бы customViewDidPerformAction
метод, который будет вызываться из любого класса (например, контроллер вида для «обновления» цели) всякий раз, когда срабатывает action
метод. Для этого в файле реализации (CustomView.m), вам нужно вызвать метод customViewDidPerformAction
заглушки, если таковые имеются, внутри вашего метода action
:
//CustomView.m
//.......initializer and other codes
-(void)action {
//other codes
//raise a callback notifying action has been performed
if (self.delegate && [self.delegate respondsToSelector:@selector(customViewDidPerformAction:)]) {
[self.delegate customViewDidPerformAction:self];
}
}
Теперь, любой класс, который соответствует CustomViewDelegate
протокола можно зарегистрировать сам как получатель обратного вызова customViewDidPerformAction:
. Например, скажем, наш класс контроллера вида MyViewController1
соответствует протоколу. Таким образом, заголовок класса будет выглядеть примерно так:
//MyViewController1.h
//include headers
@interface MyViewController1 : UIViewController<CustomViewDelegate>
//........your properties, methods, etc
@property(nonatomic,strong) CustomView* myCustomView;
//......
@end
Затем вам нужно зарегистрировать этот класс как delegate
из myCustomView
, после инстанцировании myCustomView
. Скажем, вы создали экземпляр myCustomView
в методе viewDidLoad
VC. Таким образом, тело метода было бы что-то подобное:
-(void)viewDidLoad {
////...........other codes
CustomView* cv = [[CustomView alloc] initWithFrame:<# your frame size #>];
cv.delegate = self;
self.myCustomView = cv;
[cv release];
////......other codes
}
Тогда вам также необходимо создать метод с таким же методом, как подписи протокола заявляет, внутри реализации (.m) файл того же VC и правой ваш «обновить» код:
-(void)customViewDidPerformAction:(CustomView*)customView {
///write your refresh code here
}
И вы все настроены. MyViewController1
будет выполнять ваш код обновления всякий раз, когда метод action
выполняется CustomView
.
Вы можете следить за один и тот же механизм (соответствует CustomViewDelegate
протоколу и осуществлять customViewDidPerformAction:
метод) из любого VC, содержащий в своей иерархии видов в CustomView
, чтобы обновить себя всякий раз, когда action
срабатывает.
Надеюсь, это поможет.
Пожалуйста, уточните свой вопрос, надеюсь, с кодом. Его трудно понять, чего вы хотите от блока текста. Благодаря! – Jack
было бы очень сложно опубликовать код для этого без большого количества. Я в основном хочу обновить представление из другого представления. –
Ага, я думаю, в этом случае вам нужен протокол делегатов, см. Http://stackoverflow.com/questions/6168919/how-do-i-set-up-a-simple-delegate-to-communicate-between -Два-View-контроллеры – Jack