Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 正在尝试将属性放入协议中_Ios_Objective C_Properties_Mapkit_Protocols - Fatal编程技术网

Ios 正在尝试将属性放入协议中

Ios 正在尝试将属性放入协议中,ios,objective-c,properties,mapkit,protocols,Ios,Objective C,Properties,Mapkit,Protocols,有人能解释一下如何将属性放入协议中,以便跨不同的视图控制器访问它的值吗? 具体地说,我正在尝试将MKMapView属性放入协议中。我有两个视图控制器: 地图视图控制器(内部为2.表列表视图控制器) 表列表视图控制器 为了能够在表列表视图控制器中选择与地图视图控制器中的注释相对应的post,我需要能够在地图视图控制器中访问地图视图。这就是我认为协议会派上用场的地方 地图视图控制器.h @protocol MapViewDelegate <MKMapViewDelegate> @pro

有人能解释一下如何将属性放入协议中,以便跨不同的视图控制器访问它的值吗?

具体地说,我正在尝试将MKMapView属性放入协议中。我有两个视图控制器:

  • 地图视图控制器(内部为2.表列表视图控制器)
  • 表列表视图控制器
  • 为了能够在表列表视图控制器中选择与地图视图控制器中的注释相对应的post,我需要能够在地图视图控制器中访问地图视图。这就是我认为协议会派上用场的地方

    地图视图控制器.h

    @protocol MapViewDelegate <MKMapViewDelegate>
    
    @property (nonatomic, strong) IBOutlet MKMapView *mapView;
    
    @end
    
    @interface PAWWallViewController : UIViewController <MapViewDelegate, ...>
    
    ...
    
    @end
    
    ...
    @synthesize mapView = _mapView
    ...
    
    @interface PAWWallPostsTableViewController : PFQueryTableViewController <MapViewDelegate...>
    
    ...
    
    表视图控制器.h

    @protocol MapViewDelegate <MKMapViewDelegate>
    
    @property (nonatomic, strong) IBOutlet MKMapView *mapView;
    
    @end
    
    @interface PAWWallViewController : UIViewController <MapViewDelegate, ...>
    
    ...
    
    @end
    
    ...
    @synthesize mapView = _mapView
    ...
    
    @interface PAWWallPostsTableViewController : PFQueryTableViewController <MapViewDelegate...>
    
    ...
    

    以下是有关属性的背景信息:

    简言之,属性是定义getter方法、setter方法和实例变量(也称为ivar)的快速方法

    如果你仔细想想,协议中的非自动合成属性是正确的行为,一开始有点令人惊讶。协议定义接口,但从不创建代码

    在您的示例中,协议:

    @protocol MapViewDelegate <MKMapViewDelegate>
    @property (nonatomic, strong) IBOutlet MKMapView *mapView;
    @end
    
    @协议MapViewDelegate
    @属性(非原子,强)IBMMapView*mapView;
    @结束
    
    -mapView
    -setMapView:
    创建接口,但不为这些方法创建实现

    有几种方法可以在
    @实现中获得所需的方法

  • 声明
    @合成地图视图MapViewDelegate
    的任何类的
    @implementation
    中。你已经发现了这个。顺便说一句:我建议
    @synthesis-mapView=\u-mapView因为这是自动合成ivar名称的方式
  • 声明
    @property(非原子,强)IBOutlet MKMapView*mapViewMapViewDelegate
    的任何类的
    @接口中的
  • 创建实例方法
    -(MKMapView*)mapView
    -(void)setMapView:(MKMapView*)mapView
    。这是用于创建属性的旧手动路线。除了定义getter和setter之外,还需要创建一个ivar来保存值。注意:我只是出于完整性考虑才把它包括进来,这不是一个建议

  • 请包含您看到的错误的全文。协议不会使属性神奇地可用,它只是使引用更容易,而无需使用其他包含。若要引用属性,需要指向包含该属性的对象的指针。我已更新了它。在两个.m文件中合成后,现在不会发送错误。但是self.mapView在日志中返回null。我添加了合成,因为我有警告说自动属性合成不会合成属性mapView。在我添加此项之前,它发送了错误:**由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[setValue:forUndefinedKey:]:此类不符合key mapView的键值编码要求。”***@hotlick示例说明如何指向包含属性的对象?首先,您确定它是哪个对象,然后复制指向对象的指针。谢谢!我使用@synthesis mapView=\u mapView实现了第一种方法;在我的墙视图控制器中。我现在当然得到了一个值,但我仍然需要将该值传递给仍然返回null的表视图控制器。@teenyton-“但我仍然需要将该值传递给仍然返回null的表视图控制器”-将属性放入协议中不会共享它,它只是说任何实现协议的类都必须提供这样的属性。两个类中的属性是独立的,设置一个不会影响另一个。