2014-02-12 6 views
-1

У меня есть пользовательский UIView, который был загружен в другой UIViewController. У меня есть кнопка в пользовательском UIView, которая вызывает метод внутри своего класса. Я хочу, чтобы этот метод обновил UIViewController, в который встроен UIView. В настоящее время я попытался импортировать UIViewController в UIView, инициализируя его, а затем вызывая открытый метод, который я разместил внутри UIViewController. Ничто, что происходит внутри этого метода, похоже, влияет на него, хотя я даже попытался изменить заголовок navigation bar, и это не сработает. Я знаю, что метод вызывается, хотя он появляется в моем журнале.Пользовательский UIView внутри кнопки UIViewController нажмите, чтобы обновить UIViewController

Любая помощь?

+0

Пожалуйста, уточните свой вопрос, надеюсь, с кодом. Его трудно понять, чего вы хотите от блока текста. Благодаря! – Jack

+0

было бы очень сложно опубликовать код для этого без большого количества. Я в основном хочу обновить представление из другого представления. –

+0

Ага, я думаю, в этом случае вам нужен протокол делегатов, см. Http://stackoverflow.com/questions/6168919/how-do-i-set-up-a-simple-delegate-to-communicate-between -Два-View-контроллеры – Jack

ответ

1

Здесь вводится шаблон делегирования. Если я не понял вас неправильно, вы хотите выполнить какое-либо действие (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 срабатывает.

Надеюсь, это поможет.

Смежные вопросы