iOS协议问题

时间:2014-02-09 05:28:25

标签: ios uiviewcontroller protocols

我一直盯着代码太长,并且知道我在这里使用我的协议做一些愚蠢的事情,如果有人可以启发我那会很棒。

尝试将我的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!");
    }
     }

任何其他批评都可以随意投入 - 我已经看过其他一些协议问题和例子,但我知道这是我想念的东西。

1 个答案:

答案 0 :(得分:0)

问题是你的SecondViewControllerpassNames协议没有关系(在同一个标​​题中声明不计算)。

由于协议方法需要实现(或者它们的实现是从基础继承的)而SecondViewController没有这样做,所以在不触发错误的情况下无法调用setAreaName:

如果您想在两个视图控制器中使用通用协议,则需要执行以下操作:

  • passNames协议提供一个以大写字母开头的更常规名称,并将其放在单独的头文件中
  • 在两个视图控制器中包含该标头(#import "SecondViewController.h"中的FirstTableViewController.h看起来不正确)
  • 在两个视图控制器中放置setAreaName:的实现。

请注意,您不能将常用功能放在超类中,因为您的视图控制器从不同的基础继承(即UIViewControllerUITableViewController)。