我一直盯着代码太长,并且知道我在这里使用我的协议做一些愚蠢的事情,如果有人可以启发我那会很棒。
尝试将我的areaNameLabel更改为viewcontrollers之间的cell.nameLabel.text。
FirstTableViewController.h
#import <UIKit/UIKit.h>
#import "FirstTableCell.h"
#import "SecondViewController.h"
@interface FirstTableViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate, passNames>
@property (nonatomic, strong) NSString *passedNameString;
@property (strong, nonatomic) NSMutableArray *names;
FirstTableViewController.m
#import "FirstTableViewController.h"
@interface FirstTableViewController ()
@end
@implementation FirstTableViewController
@synthesize names;
@synthesize passedNameString;
- (void)viewDidLoad
{
[super viewDidLoad];
names = [NSMutableArray arrayWithObjects:@"Bondi", @"Miranda", nil];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
FirstTableCell *cell = (FirstTableCell *)[tableView cellForRowAtIndexPath:indexPath];
if ([cell.nameLabel.text isEqualToString:@"Bondi"]) {
SecondViewController *mapController = [[SecondViewController alloc] init];
NSString *passedName = cell.nameLabel.text;
mapController.passedNameString = passedName;
[mapController setDelegate:self];
self.tabBarController.selectedIndex = 1;
NSLog(@"Hola");
}
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
#pragma mark - Protocol Methods
-(void)setAreaName:(NSString *)areaName {
passedNameString = areaName;
}
SecondViewController.h
#import <UIKit/UIKit.h>
@protocol passNames <NSObject>
-(void)setAreaName:(NSString *)areaName;
@end
@interface SecondViewController : UIViewController <RMMapViewDelegate>
@property (retain) id <passNames> delegate;
@property (nonatomic, strong) NSString *passedNameString;
@property (weak, nonatomic) IBOutlet RMMapView *mapView;
@property (weak, nonatomic) IBOutlet UILabel *areaNameLabel;
@end
SecondViewController.m
#import "SecondViewController.h"
#import "FirstTableViewController.h"
@interface SecondViewController ()
@end
@implementation SecondViewController @synthesize areaNameLabel; @synthesize delegate, passedNameString;
- (void)viewDidLoad {
[super viewDidLoad];
passedNameString = areaNameLabel.text;
[[self delegate] setAreaName:passedNameString];
if ([areaNameLabel.text isEqualToString:@"Bondi"]) {
NSLog(@"You got it!");
}
}
任何其他批评都可以随意投入 - 我已经看过其他一些协议问题和例子,但我知道这是我想念的东西。
答案 0 :(得分:0)
问题是你的SecondViewController
与passNames
协议没有关系(在同一个标题中声明不计算)。
由于协议方法需要实现(或者它们的实现是从基础继承的)而SecondViewController
没有这样做,所以在不触发错误的情况下无法调用setAreaName:
。
如果您想在两个视图控制器中使用通用协议,则需要执行以下操作:
passNames
协议提供一个以大写字母开头的更常规名称,并将其放在单独的头文件中#import "SecondViewController.h"
中的FirstTableViewController.h
看起来不正确)setAreaName:
的实现。请注意,您不能将常用功能放在超类中,因为您的视图控制器从不同的基础继承(即UIViewController
和UITableViewController
)。