2014-10-02 4 views
0

У меня есть класс, который подклассы UITableViewController. На основании действий пользователя, которые распознаются в этом классе, мне нужно вызвать метод в таблице в UIViewController, если была создана эта таблица. Я не могу понять, как это сделать.Метод вызова в другом классе

Я попытался сделать функцию статической, но это не сработает, так как есть переменная экземпляра, которую мне нужно достичь. Возможно, я мог бы использовать NSNotificationCenter, но моя интуиция заключается в том, что есть лучший способ. Может кто-нибудь помочь? Благодаря!

MonthsTableViewController.h

@interface MonthsTableViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate> 
{ 
    NSArray *monthsArray; 
} 
@end 

MonthsTableViewController.m

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 
    NSLog(@"calling the UIViewController"); 
    //this is where I am stuck!!! 
} 

SubscribeViewController.h

@interface SubscribeViewController : UIViewController <SIMChargeCardViewControllerDelegate> 
{ 
    MonthsTableViewController *monthsController; 
    IBOutlet UITableView *monthsTable; 
} 

- (void) snapMonthsToCenter; 

@end 

SubscribeViewController.m

- (void) snapMonthsToCenter { 
    // snap the table selections to the center of the row 
    NSLog(@"method called!"); 
    NSIndexPath *pathForMonthCenterCell = [monthsTable indexPathForRowAtPoint:CGPointMake(CGRectGetMidX(monthsTable.bounds), CGRectGetMidY(monthsTable.bounds))]; 
    [monthsTable scrollToRowAtIndexPath:pathForMonthCenterCell atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; 
} 
+0

Отправить уведомление или определить протокол и делегат в 'MonthsTableViewController'. Затем «MonthsTableViewController» может сказать своему делегату, что что-то произошло. «SubscriberViewController» может быть делегатом. Когда вызывается метод делегата, 'SubscribeViewController' может вызывать собственный' snapMonthsToCenter' или что-то еще, что ему нужно сделать. – rmaddy

ответ

0

В основном для этого вам нужна ссылка на ваш UIViewController из вашего UITableViewController. Это позволит вам вызвать методы этого объекта. Обычно вы вызываете это свойство delegate, потому что вы назначаете «родительский» UIViewController в качестве делегата «дочернего» UITableViewController.

Измените UITableViewController (MonthsTableViewController.h), чтобы добавить свойство делегата следующим образом:

@interface MonthsTableViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate> 
{ 
    NSArray *monthsArray; 
    id delegate; 
} 

@property (nonatomic, retain) id delegate; 

@end 

Вы должны @synthesize свойство в файле .m. Вы также захотите импортировать SubscribeViewController.h в свой заголовок здесь, если вы еще этого не сделали.

Затем, когда вы создать экземпляр MonthsTableViewController, установить делегат к текущему объекту MonthsTableViewController так:

MonthsTableViewController *example = [[MonthsTableViewController alloc] init.... // This is the line you should already have 
[example setDelegate:self]; // Set this object's delegate property to the current object 

Теперь у вас есть доступ к родителю SubscribeViewController от вашего MonthsTableViewController. Итак, как вы называете функции? Легко! Вы можете либо жёстко вызов метода, или, чтобы быть супер безопасно использовать respondsToSelector::

[(MonthsTableViewController*)[self delegate] snapMonthsToCenter]; 

В вашем случае, приведенный выше код абсолютно нормально, потому что вы знаете, что этот метод всегда будет существовать на этом объекте. Как правило, делегаты объявляются как протоколы, которые могут иметь необязательные методы. Это означает, что хотя методы объявлены в @interface, они могут фактически не существовать (быть реализованы) в объекте. В этом случае, следующий код будет использоваться, чтобы убедиться, что этот метод действительно можно назвать на объекте:

if([[self delegate] respondsToSelector:@selector(snapMonthsToCenter)]) { 
    [[self delegate] snapMonthsToCenter]; 
} 
+0

Большое спасибо. Отлично! – Alex

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