我有一个自定义单元格。其中UITextField
与customCell.m
相关联。我正在尝试将文本从textField
传递给mainVC.m
。
我在customCell.m
中有一个公共方法:
- (NSString *)PassText{
return self.myTextField.text;
}
如何将该方法传递给mainVC.m
中的字符串?
答案 0 :(得分:3)
您需要做的是:
CustomCell
MainVC
<强> 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
以下显示了您如何使用上述协议。
在CustomCell
中创建MainCV
时设置代理。如下所示,
CustomCell *cell = ... allocation and initialization
cell.delegate = self; // self is mainVC
每当您需要在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 *customCell
和MainVC
。然后,您可以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);
}
希望这有助于你.. :)