2014-01-13 46 views
-1

我不知道這是否被認爲是一個公認的Objective-C實踐,所以我願意接受其他想法。這是主意。我有一個表格是從一個自定義的UITableViewCell獲取單元格。這些單元中的每一個都呈現用戶可以參加的事件。因此,我希望用戶能夠直接從表格視圖將它們添加到他們的日曆中。UITableCell和UIViewController之間的可見性

爲了做到這一點,我在每個表格單元上放了一個按鈕 - 一個「添加到日曆按鈕」。我堅持的是如何將一個動作從這個按鈕連接回UITableView是子視圖的UIViewController。該按鈕是UITableView類的一部分,並且不具有對UIViewController的可見性。

我一直在嘗試實施下面Aaron建議的委託模式。我幾乎在那裏,但仍然有一些連接斷開。以下是我有:

新協議EventDelegate.h

@protocol EventDelegate <NSObject> 
- (void) addToCalendar : (NSString *) strDate; 
@end 

MyTableCell.h,我已經加入這個屬性:

@property (nonatomic, strong) id<EventDelegate> eventDelegate; 

MyTableCell.m,我加入這個方法:

- (IBAction)addToCalendar:(UIButton *)sender 
{ 
    NSLog(@"calling addToCalendar delegate %@", _dayAndTime.text); 
    [self.eventDelegate addToCalendar:_dayAndTime.text]; 
} 

這一切都很好。當我點擊我添加到表單元中的按鈕,我得到的輸出calling addToCalendar delegate Monday, January 13

結束在MyViewController.h,我改成了這個樣子:

@interface TrainingScheduleViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, EventDelegate> 
- (void) addToCalendar:(NSString *)strDate; 
@end 

最後,在MyViewController.m我添加的方法身體:

- (void) addToCalendar:(NSString *)strDate 
{ 
    NSLog(@"inside delegate"); 
    NSLog(@"%@", strDate); 
} 

的一部分,我認爲可能是問題出在哪裏亞倫提出加入這一行的代碼:

[tableViewController setEventDelegate:self];

首先,我不確定在哪裏添加這一行。我把它放在viewDidLoad。編譯器不會讓我逐字鍵入它,這樣我就可以找到最接近的事情是這條線:

[self.tableView setDelegate:self];

也許我需要一個額外的插座?

我必須差不多那裏,但我只是看不到我仍然缺少的東西。誰能幫我?謝謝!

+0

添加自定義委託。當自定義tableview收到「添加到日曆」操作時,它會調用委託方法,傳遞要添加到日曆中的條目的詳細信息。然後讓視圖控制器成爲這個自定義委託的使用者。 – trojanfoe

+0

@ usr55410 - 請參閱下面的答案。它解釋瞭如何使用自定義委託。 – Aaron

回答

0

這裏是我從我的「cellForRowAtIndexPath」方法中拉出的一些示例代碼。這是來自一個建立在IB中的表格,並且使用了一個原型單元格,但無論您如何實現,這個想法都是一樣的。在這種情況下,我使用一個標記來識別所述按鈕,然後引用它創建單元時:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    UIButtonRed *actionButton = (UIButtonRed *)[cell.contentView viewWithTag:4]; 
    [actionButton addTarget:self action:@selector(initializeReorder:) forControlEvents:UIControlEventTouchDown]; 

    return cell; 
} 

的initializeReorder:方法自動接收(ID)發送者作爲參數。您可以強制轉換成表格單元格並檢查它來獲取您的信息的其餘部分:

- (void)initializeReorder:(id)sender 
{ 
    UIButtonRed *actionButton = (UIButtonRed*)sender; 
    UITableViewCell *cell = (UITableViewCell*)actionButton.superview.superview;  
    NSIndexPath* cellPath = [self.tableView indexPathForCell:cell]; 
    ... 
} 
0

創建此協議。

我會這樣定義一個協議:

@protocol MyEventDelegate <NSObject> 
- (void)addToCalendar:(Event*)event; 
@end 

並委託屬性添加到這兩個UITableViewController類和你MyTableCell類:

@property (nonatomic, strong) id<MyEventDelegate> eventDelegate; 

MyViewController應符合本協議並實施addToCalendar:

@interface MyViewController : UIViewController <MyEventDelegate> 

當您MyViewController對象樹立UITableViewController,傳遞到自身的引用:

[tableViewController setEventDelegate:self]; 

,當你UITableViewController創建的每個細胞,把它傳遞:

[cell setEventDelegate:self.eventDelegate]; 

現在,當IBAction爲被稱爲在你的單元格中,單元格可以調用MyViewController上的代理方法,如下所示:

[self.eventDelegate addToCalendar:event]; 
+0

謝謝@Aaron。我已經採取措施實施您的建議。我覺得所有東西都在那裏,除了'[tableViewController setEventDelegate:self]'這行外,'但它還沒有工作。任何建議表示讚賞。謝謝! – Alex

相關問題