有人可以解释一下如何在协议中放置属性以便在不同的视图控制器中访问它的基础知识吗?
具体,我试图将MKMapView属性放入协议中。我有两个视图控制器:
为了能够在表格列表视图控制器中选择与地图视图控制器中的注释相对应的帖子,我需要能够访问地图视图控制器中的地图视图。这是我认为协议会派上用场的地方。
地图视图控制器.h
@protocol MapViewDelegate <MKMapViewDelegate>
@property (nonatomic, strong) IBOutlet MKMapView *mapView;
@end
@interface PAWWallViewController : UIViewController <MapViewDelegate, ...>
...
@end
地图视图控制器.h
...
@synthesize mapView = _mapView
...
表视图控制器.h
@interface PAWWallPostsTableViewController : PFQueryTableViewController <MapViewDelegate...>
...
表视图控制器。米
...
@synthesize mapView;
...
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// call super because we're a custom subclass.
[super tableView:tableView didSelectRowAtIndexPath:indexPath];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
PFObject *object = [self.objects objectAtIndex:indexPath.row];
PAWPost *post = [[PAWPost alloc] initWithPFObject:object];
[mapView setCenterCoordinate: post.coordinate animated:YES];
[mapView selectAnnotation:post animated:YES];
NSLog(@"MAP VIEW: %@", mapView); // STILL NULL
}
答案 0 :(得分:0)
以下是有关属性的背景信息:Encapsulating Data。
简而言之,属性是定义getter方法,setter方法和实例变量(也称为ivar)的快速方法。
如果你考虑一下,协议中的非自动合成属性是正确的行为,一开始有点令人惊讶。协议定义了一个接口,但从不创建代码。
在您的示例中,协议:
@protocol MapViewDelegate <MKMapViewDelegate>
@property (nonatomic, strong) IBOutlet MKMapView *mapView;
@end
为-mapView
和-setMapView:
创建一个界面,但不会为这些方法创建实现。
有几种方法可以在@implementation
中获得所需的方法。
@synthesize mapView;
的类的@implementation
中声明MapViewDelegate
。 您已经发现了这个。顺便说一句:我会推荐@synthesize mapView = _mapView;
,因为这是自动合成命名ivar的方式。@property (nonatomic, strong) IBOutlet MKMapView *mapView;
的任何类的@interface
中声明MapViewDelegate
。- (MKMapView *)mapView
和- (void)setMapView:(MKMapView *)mapView
。这是用于创建属性的旧手动路径。除了定义getter和setter之外,您还需要创建一个ivar来保存值。 注意:为了完整起见,我只包括了这个,这不是推荐。