将方法从我的自定义单元格类传递给主类

时间:2015-02-26 03:26:00

标签: ios objective-c uitableview methods custom-cell

我有一个自定义单元格。其中UITextFieldcustomCell.m相关联。我正在尝试将文本从textField传递给mainVC.m

我在customCell.m中有一个公共方法:

- (NSString *)PassText{
   return self.myTextField.text;
}

如何将该方法传递给mainVC.m中的字符串?

6 个答案:

答案 0 :(得分:3)

您需要做的是:

  1. 定义protocol
  2. 为您的CustomCell
  3. 添加此协议的属性
  4. MainVC
  5. 中实施协议

    <强> 1。定义协议

    我们通常将协议的定义放在头文件中(在本例中为CustomCell.h)。

     // define the protocol for the delegate
     @protocol CustomCellDelegate 
     // define protocol functions that can be used in any class using this delegate
     -(void)customCell:(CustomCell *)customCell passText:(NSString *)text;
     @end
    

    <强> 2。为您的CustomCell

    添加此协议的属性

    并在CustomCell@interface CustomCell之间的@end添加此内容。

    @property (nonatomic, weak) id<CustomCellDelegate> delegate; 
    

    第3。在MainVC

    中实施协议

    MainVC中,按以下方式实施委托功能。

    @interface MainCV<CustomCellDelegate>
    @end
    
    @implementation MainVC 
    -(void)customCell:(CustomCell *)customCell passText:(NSString *)text
    {
         // Do whatever you want with text here
    }
    @end
    

    以下显示了您如何使用上述协议。

    1. CustomCell中创建MainCV时设置代理。如下所示,

      CustomCell *cell = ... allocation and initialization
      cell.delegate = self; // self is mainVC
      
    2. 每当您需要在customCell中传递数据NSString时,请调用以下内容:

      [self.delegate customCell:self passText:self.myTextField.text]; // self is customCell
      

答案 1 :(得分:3)

根据我的理解,我认为你正在寻找这种方法,如果我在这里错了,请告诉我。

在索引路径中选择行时,首先需要找到自定义单元格,然后找到所需的文本字段。像这样:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    customCell* cell=(customCell*)[tableView cellForRowAtIndexPath:indexPath.Row];
    NSString* yourTextFieldText=cell.textField.text;
    mainVC* objmainVC=[mainVC alloc]init];
    objmainVC.yourTextFieldText=yourTextFieldText;
    [self.navigationController pushViewController:objmainVC animated:YES];

}

现在您也可以将yourTextFieldText用于mainVC控制器。

答案 2 :(得分:0)

如何在@class CustomCell;中创建@propety (strong, nonatomic) CustomCell *customCellMainVC。然后,您可以self.customCell.textField.text访问它。

答案 3 :(得分:0)

麦克, 数据传递的正常模式是使用属性和委托。如果要将信息传递给视图控制器,请使用委托。当您说自定义单元格时,我不确定您是在讨论UItableview单元格还是收集单元格。 uitableview和collection视图都有很多方法可以将信息传递回视图控制器。

答案 4 :(得分:0)

有一种更简单的方法可以做到这一点。

这假设您以编程方式执行此操作,并且在textField正常工作的情况下正确设置了自定义单元格。

首先,您需要从自定义单元格外部访问textField。您可以通过将其作为属性放入头文件的常规方式执行此操作:

customCell.h

@property (weak, nonatomic) IBOutlet UITextField * customTextField;

确保将其分配到自定义单元格XIB中。

现在,当我们访问主视图控制器的cellForRowAtIndex中的单元格时,我们有一个指向自定义textField的指针:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    //Adding the cell - remember to add the identifier to the xib file
    BCustomCell * cell = [tableView dequeueReusableCellWithIdentifier:bCustomCellIdentifier];

    // We can now access our cell's textField
    cell.textLabel.text = cell.customTextField.text;

    return cell;
}

希望这会帮助你。

答案 5 :(得分:0)

是的,你可以在代表的帮助下做到这一点,例如,

在自定义单元格中,我选择了一个按钮和textfield,我定义了一个如下所示的协议

//in CustomCell.h file
@class CustomCell;
@protocol CellDelegate <NSObject> //protocol defination
- (void)whenDoneButtonClicked:(CustomCell *)cell; //i am passing the cell this would be the good to get whole information of a cell for example apart from properties u can get index path ..
@end


@interface CustomCell : UITableViewCell <UIWebViewDelegate>
@property (weak, nonatomic) IBOutlet UIButton *aButton;
@property (weak, nonatomic) IBOutlet UITextField *aTextField;

@property (nonatomic, assign) id<CellDelegate> delegate; //declare a delegate 

@end
在CustomCell.m文件中的

你可以这样做

// this is the button action method in the custom cell, when the 
// button tapped, this method is called in this method u are 
// calling the delegate method which is defined in the controller.
- (IBAction)buttonAction:(id)sender
 {
    //as in your case user enter the text in textfield and taps button
     if([self.delegate respondsToSelector:@selector(whenDoneButtonClicked:)]) //checking weather it is safe to call the delegate method, it is not need but some times it is necessary to check to avoid crashes
          [self.delegate whenDoneButtonClicked:self]; //pass the cell or if u want text then u can also pass text also by adding 2 or more parameters
 }  

// in the above method u are calling the delegate method by passing
// the cell (hear the self means -> current object -> nothing but cell)  
// u are calling the delegate method defined in the controller by
// passing the  "self" nothing but cell ...  
maninVc中的

如下所示

在viewcontroller.h文件中

#import "CustomCell.h"
@interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate,CellDelegate> //confirms to delegate 

@property (nonatomic, retain) IBOutlet UITableView *tableView;
//.....  rest of the properties and method 

@end

并在viewcontroller.m文件中

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 {
     CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
     if(cell == nil)
     {
        cell = [CustomCell cell]; //initilization if it is nil 

     } 

    cell.delegate = self; //set the delegate to self 
    //...other code 
    return cell;
 } 


 //define the delegate method

 // when u are calling this method from customCell class by passing 
 // the cell->(self) hear u get the cell        
 - (void)whenDoneButtonClicked:(CustomCell *)cell
 {
    //hear u will get a cell
     NSLog(@"text is:%@",cell.aTextField.text); 
 }

希望这有助于你.. :)