Pol*_*lly 5 model-view-controller xcode objective-c
我是兼职记事本网站编码器,采取步骤进入IOS应用程序.我上周得到了我的第一台mac,并拼凑了一个半工作的应用程序.现在,通过这个SO答案,我正在重新开始尝试学习MVC.我的学习曲线非常陡峭所以请耐心等待.
我已经读过MVC,分层,三个盒子和一些箭头,我明白了.然而,将理论转化为现实世界令人沮丧.我看过的大多数示例应用程序似乎都没有使用MVC.甚至来自Apple的这个LazyTableImages示例似乎也使用app delegate
了让我困惑的模型.我建立在这个非常简单的MVC示例上.
我的应用从网络服务中检索位置标记.我有一个使用ARC的标签应用程序.一个选项卡有一个Mapkit地图来显示标记.
一个简单的类来保存标记记录:
@interface MarkerRecord : NSObject
@property (strong, nonatomic) NSDecimalNumber *lat;
@property (strong, nonatomic) NSDecimalNumber *lon;
@property (strong, nonatomic) NSString *des;
Run Code Online (Sandbox Code Playgroud)
一个Model类,包含一组Marker类,用于提供两个视图.这是我的Model类.h:
@interface MarkersModel : NSObject
- (void)getMarkers; // Send HTTP GET to web service to retrieve JSON markers
- (void)postMarker; // Send HTTP POST to web service to INSERT new marker record
Run Code Online (Sandbox Code Playgroud)
并实施:
@interface MarkersModel ()
@property (strong, nonatomic) NSArray *data;
@end
@implementation MarkersModel
@synthesize data;
- (void)getMarkers
{
// Send HTTP GET to web service to retrieve JSON markers
...
}
- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects
{
// Thanks to Restkit data is an array of Marker classes
data = objects;
// Pass data to controller
}
Run Code Online (Sandbox Code Playgroud)
一个mapViewController类.h:
#import <MapKit/MapKit.h>
#import "MarkersModel.h"
@interface MapViewController : UIViewController<MKMapViewDelegate> {
MarkersModel *markersModel;
}
@property (nonatomic, strong) IBOutlet MKMapView *mapView;
@end
Run Code Online (Sandbox Code Playgroud)
并实施:
@interface MapViewController ()
@end
@implementation MapViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Create instance of markers model
markersModel = [[MarkersModel alloc] init];
}
-(void)viewWillAppear:(BOOL)animated
{
[markersModel getMarkers];
}
- (void)putMarkersOnMap
{
// To be called by Markers Model
...
}
Run Code Online (Sandbox Code Playgroud)
这是我的主要问题:
如果是这样:
我强烈怀疑答案是控制器上的自定义委托,但我不能为我的生活看到如何实现它.我无法将任何例子与我的情况联系起来.我想在控制器上我需要这样的东西:
@class MapViewController;
@protocol MapViewControllerDelegate;
Run Code Online (Sandbox Code Playgroud)
虽然我还有其他一些问题:
unsafe_unretained
(我编译为4.3)?我希望这是明确的,也是一个可接受的问题.感谢你的耐心,波莉.
我的代码是否是一个体面的MVC实现的上面(开头)?
按我的标准,是的
如何让Model更新Controller
你是对的,你想使用委托.您声明委托协议以及它作为委托的类.所以扩展你的MarkersModel
标题:
@protocol MarkersModelDelegate<NSObject>
-(void) markersDidUpdate:(MarkersModel*)model;
@end
@interface MarkersModel : NSObject
{
__weak id<MarkersModelDelegate> delegate;
}
@property(weak,nonatomic) id<MarkersModelDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)
然后在你的视图控制器中:
@interface MapViewController : UIViewController<MKMapViewDelegate, MarkersModelDelegate> {
Run Code Online (Sandbox Code Playgroud)
然后在模型实现中:
@implementation MarkersModel
@synthesize delegate;
//...
-(void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects
{
// Thanks to Restkit data is an array of Marker classes
data = objects;
// Pass data to controller
if( delegate != nil )
{
[delegate markersDidUpdate:self];
}
}
Run Code Online (Sandbox Code Playgroud)
我会创建任何悬空指针 - 我怀疑某些事情应该是不安全的(我编译为4.3)?
不是我知道的
我在控制器类中的MarkersModel声明是否正确?我担心它不会由ARC管理.我也怀疑它是公开的,但应该是私人的.
您可以通过@private
事先添加标头将其声明为私有:
@interface MapViewController...
{
@private
MarkersModel *markersModel;
...
Run Code Online (Sandbox Code Playgroud)
MarkersModel.getMarkers方法应该是静态的吗?
如果使用static,则表示作为类级别而非实例级别方法,这完全取决于您的实现.如果所有MarkersModel
对象都应该保留相同的数据,那么将它设置为类级别是有意义的.但是如果每个MarkersModel
对象都应该保留自己的set,Markers
那么它应该仍然是实例级方法
归档时间: |
|
查看次数: |
1972 次 |
最近记录: |