我在将数据传递给新的视图控制器时遇到了问题。
我有两个VC。在“FirstVC”中,有一个包含动态原型单元格的表格视图。通用单元格包含一个标签和一个按钮,并将其分配给自己的类“GenericCell”。我想按下按钮时将单元格标签的文本传递给SecondVC,但应用程序崩溃时出现错误:
Interface Builder文件中的未知类_TtC13testTableView37SecondVC。
UIViewController setMyString:]:无法识别的选择器发送到实例0x7fa05e418110
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [UIViewController setMyString:]:无法识别的选择器发送到实例0x7fc8add05710
我试过了:
在getText方法之外使用segue(使用prepareForSegue方法)
1a上。从getText方法的外部推送VC
实现和调用myString的set / get方法
向myString属性添加属性
但应用程序崩溃了。
GenericCell.h
#import <UIKit/UIKit.h>
@protocol MyCellDelegate
-(void)getText:(NSString *)text;
@end
@interface GenericCell: UITableViewCell
@property (weak, nonatomic) IBOutlet UILabel * label;
@property (assign, nonatomic) id <MyCellDelegate> delegate;
@end
GenericCell.m
#import "GenericCell.h"
@interface GenericCell()
@end
@implementation GenericCell
- (IBAction)buttonPressed {
if (self.delegate) {
[self.delegate getText:self.label.text];
}
}
@end
FirstVC.m
#import "FirstVC.h"
#import "GenericCell.h"
#import "SecondVC.h"
@interface FirstVC() <UITableViewDataSource,UITableViewDelegate, MyCellDelegate>
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property NSString * idToPass;
@end
@implementation FirstVC
NSMutableArray<NSString *> *array;
- (void)viewDidLoad {
array = [[NSMutableArray alloc]initWithObjects:@"0x22", @"0x11", @"0x24", nil];
[super viewDidLoad];
self.tableView.dataSource=self;
self.tableView.delegate=self;
self.tableView.rowHeight=100;
}
-(void)getText:(NSString *)text {
self.idToPass = text;
SecondVC * secondVC = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondVC"];
secondVC.myString = self.idToPass;
[[self navigationController] pushViewController:secondVC animated:YES];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return array.count;
}
- (GenericCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
GenericCell * cell = [[self tableView]dequeueReusableCellWithIdentifier:@"GenericCell" forIndexPath:indexPath];
cell.delegate = self;
cell.label.text = [array objectAtIndex:indexPath.row];
return cell;
}
@end
SecondVC.h
#import <UIKit/UIKit.h>
@interface SecondVC : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *label;
@property NSString * myString;
@end
SecondVC.m
#import "SecondVC.h"
@interface SecondVC ()
@end
@implementation SecondVC
- (void)viewDidLoad {
self.label.text = self.myString;
[super viewDidLoad];
}
@end
使用委托正确设置“idToPass”。
答案 0 :(得分:0)
在getText方法中,您将文本分配给myProperty而不是myString ...
应该是:
secondVC.myString = self.idToPass;
答案 1 :(得分:0)
这项工作对我来说:在buttonPressed方法中更新像这样的if语句
if ([self.delegate respondsToSelector:@selector(getText:)]){
[self.delegate getText:self.label.text];
}
为SecondVC提供数据的另一个选择是使用
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
SecondVC * vc = segue.destinationViewController;
if ([segue.identifier isEqualToString: @"yourSegue"]) {
vc.myString = self.idToPass;
}
}
我建议的一个提示是检查(使用简单的if语句)SecondVC中的对象是否为nil或者!nil
我希望这有帮助:)