2012-05-11 76 views
7

我已經創建了一個具有自己的.m,.h和.xib文件的自定義單元格。在單元格中,我有一個UIButton,我在IB中添加到xib中。在主視圖控制器的自定義單元格內使用UIButton的IBAction

我可以從這個自定義單元格的.m中的UIButton接收IBAction,但是真的,我想要將該按鈕按下按鈕轉移到託管表格(以及自定義單元格)的主視圖.m,並在那裏採取行動。

我已經花了最後4小時嘗試各種方式做到這一點 - 我應該使用NSNotificationCenter嗎? (我試過很多通知,但不能讓它工作,不知道我是否應該堅持就是勝利)

+0

我覺得NSNotificationCenter是一個合理的策略。您沒有收到按鈕的操作方法發送或其他問題的通知嗎? –

+0

我也這麼認爲 - 我不認爲我有實施他們的訣竅呢......更多的實踐。我現在可以讓他們在相同的視圖下工作,但是當我嘗試不同的視圖時仍然會出現異常......我們會到達 –

+0

這是關於創建和使用委託協議的非常完整的解釋。 http://www.dosomethinghere.com/2009/07/18/setting-up-a-delegate-in-the-iphone-sdk/ – MystikSpiral

回答

9

您需要在單元格的.h文件中使用委託。 聲明這樣

@class MyCustomCell; 
@protocol MyCustomCellDelegate 
- (void) customCell:(MyCustomCell *)cell button1Pressed:(UIButton *)btn; 
@end 

委託然後在.m文件

@synthesize delegate; 

和在按鈕方法

- (void) buttonPressed { 
    if (delegate && [delegate respondToSelector:@selector(customCell: button1Pressed:)]) { 
     [delegate customCell:self button1Pressed:button]; 
    } 
} 

你的視圖控制器聲明字段和屬性

@interface MyCustomCell:UItableViewCell { 
    id<MyCustomCellDelegate> delegate; 
} 

@property (nonatomic, assign) id<MyCustomCellDelegate> delegate; 

@end 

畝ST採用這個協議就像在cellForRow .m文件本

.h文件中

#import "MyCustomCell.h" 

@interface MyViewController:UIViewController <MyCustomCellDelegate> 
..... 
..... 
@end 

:你需要方法添加財產委託給細胞

cell.delegate = self; 

最後你實現從協議的方法

- (void) customCell:(MyCustomCell *)cell button1Pressed:(UIButton *)btn { 

} 

對不起,我的英語和代碼。在沒有XCODE的情況下從我的電腦寫下它

+0

- (無效)buttonPressed { 如果(委託&& [委託respondToSelector:@selector(customCell:button1Pressed :)]){ [委託customCell:自button1Pressed:按鈕]; }} 你在哪裏得到的 「按鈕」[代表customCell:自button1Pressed:按鈕]。並且當我在控制器中添加方法時,將呈現另一個視圖控制器的示例代碼是什麼?謝謝 – zramled

+0

要呈現另一個視圖控制器,您可以使用[self presentViewController:animated:completion:];或[self.navigationController pushViewController:動畫:] – Moonkid

+0

@Moonkid有沒有一個迅速的答案呢? –

0

你可能只想在按鈕添加選擇你的視圖控制器有你的tableview。

在cellForIndexPath功能

[yourCell.button addTarget:self action:@selector(customActionPressed:) forControlEvents:UIControlEventTouchDown]; 

然後處理按鈕按下你的「customActionPressed:(ID)發送」方法

//Get the superview from this button which will be our cell 
UITableViewCell *owningCell = (UITableViewCell*)[sender superview]; 

//From the cell get its index path. 
NSIndexPath *pathToCell = [myTableView indexPathForCell:owningCell]; 

    //Do something with our path 

這可能是你更好的解決方案,除非有更多的你還沒有列出的因素。

我有一個教程,是可以解釋更多http://www.roostersoftstudios.com/2011/05/01/iphone-custom-button-within-a-uitableviewcell/

+0

謝謝,我已經知道按鈕的路徑了,因爲我使用的方法是使用被選中的單元格來選擇plist(有點俗氣,但工作正常)。儘管我會嘗試你的教程,看看我能否以不同的方式來解決我的問題。 –

+0

聽起來不錯。如果您知道索引並且可以以某種方式使用它來獲取所需的數據,那麼您可能需要在擁有的視圖控制器中執行操作。祝你好運 – rooster117

+0

另外看看其他人使用委託的建議也是一個好主意。這是我前一段時間製作的另一個教程:[link] http://www.roostersoftstudios.com/2011/04/12/simple-delegate-tutorial-for-ios-development/ – rooster117

0

爲什麼不爲您的自定義單元格的委託(使用@protocol)。然後,您可以將主視圖指定爲每個單元格的委託並適當地處理該操作。

+0

我想我最好研究一下代表......我不知道該怎麼做! –

1

我遇到了同樣的問題,我通過將單元格繼承到它自己的類中,並將按鈕作爲插座並使用模型中的數據填充單元格,同時使用一種返回當前正在查看的單元格的方法。

舉例來說,如果你有一個Person類,每個人有一個名字,姓氏,和一些朋友。而且每次在單元格中點擊一個按鈕時,朋友對一個具體的人的數量將增加1

_______________DATA SOURCE___________________________ 
#import <Foundation/Foundation.h> 

@interface Person : NSObject 

@property (nonatomic, strong) NSString *name; 
@property (nonatomic, strong) NSString *comment; 
@property (nonatomic) NSInteger numberOfFriends; 


+(instancetype)personWithName:(NSString *)aName Surname:(NSString *)aSurname; 

@end 

#import "Person.h" 

@implementation Person 

+(instancetype)personWithName:(NSString *)aName Surname:(NSString *)aSurname{ 

    Person *person = [[Person alloc] init]; 
    [person setName:aName]; 
    [person setSurname:aSurname]; 
    [person setNumberOfFriends:0]; 

    return person; 
} 

@end 

_____________________PERSON CELL________________________ 

#import <UIKit/UIKit.h> 

@interface PersonCell : UITableViewCell 

@property (strong, nonatomic) IBOutlet UILabel *friendsNum; 
@property (strong, nonatomic) IBOutlet UIButton *friendsBtn; 
@property (strong, nonatomic) IBOutlet UILabel *nameLabel; 
@property (strong, nonatomic) IBOutlet UILabel *surnameLabel; 


@end 

個人而言,我創建了一個私人的NSArray持有我一個人對象的名稱和一個私人的NSMutableDictionary增加來保存我的Person對象,並且我將這些鍵設置爲人員的名字。

_____________________PERSON TABLE VIEW________________________  
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    PersonCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
    NSString *name = [peopleNames objectAtIndex:indexPath.row]; 
    Person *person = [people objectForKey:name]; 

    if(cell == nil) 
    { 
     cell = [[PersonCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    // Configure the cell... 
    cell.nameLabel.text = person.name; 
    cell.surname.Label.text = person.surname 

    [cell.friendsButton addTarget:self action:@selector(moreFriends:) forControlEvents:UIControlEventTouchUpInside]; 

    cell.friendsNum.text = [NSString stringWithFormat:@"%i", person.numberOfFriends]; 

    return cell; 
} 

- (IBAction)moreFriends:(id)sender { 
    UIButton *btn = (UIButton *)sender; 
    PersonCell *cell = [self parentCellForView:btn]; 
    Person *person = [people objectForKey:cell.nameLabel.text]; 
    person.numberOfFriends++; 
    [self.tableView reloadData]; 
} 

-(PersonCell *)parentCellForView:(id)theView 
{ 
    id viewSuperView = [theView superview]; 
    while (viewSuperView != nil) { 
     if ([viewSuperView isKindOfClass:[PersonCell class]]) { 
      return (PersonCell *)viewSuperView; 
     } 
     else { 
      viewSuperView = [viewSuperView superview]; 
     } 
    } 
    return nil; 
} 
相關問題