小编Dal*_*to1的帖子

了解模型 - 视图 - 控制器

我有一个应用程序,我想有一个"背景"视图(视图控制器视图),最重要的是,多个UIViews绘制自己作为圆圈.我只是不明白如何在坚持MVC的同时实现所有这一切......

模型和视图应该是不同的.这是否意味着我通常需要一组用于视图的头文件和实现文件以及另一个(单独的)模型集 - 即使我的对象只是一个Circle类?或者,我是否有一个Circle.hCircle.m设置,然后在头文件中有两个接口块,一个用于模型,一个用于视图,以及两个实现块(同样,一个用于模型,一个用于视图)?

我见过一些人建议使用视图控制器来处理所有视图loadView,并避免创建单独的自定义视图对象; 这是否意味着我不应该创建一个单独的组.h.m文件的看法?对我来说,后者在设计方面看起来更有条理.

此外,如果我有多个视图对象和视图控制器处理的多个模型对象,我会将它们存储在控制器中的两个数组中 - 一个用于模型,另一个用于视图.对?我的问题是:当我在每个模型上使用键值观察时,对于每个模型对象,我将如何更改正确的相应视图对象(假设两个数组中的两个对象的索引都不相同)?

我正在考虑使用指向视图内部的模型对象的指针,以及从视图到模型的KVOing - 但是它不会通过控制器从而完全打破MVC,对吧?

先感谢您.

model-view-controller objective-c ios

13
推荐指数
1
解决办法
4010
查看次数

将新结构作为参数传递

我有这样的功能:

- (void)addBalloon:(COLOR)color:(VELOCITY)velocity:(LOCATION)location 
Run Code Online (Sandbox Code Playgroud)

其中COLOR是枚举,VELOCITY和LOCATION是常量头文件中定义的结构.

VELOCITY和LOCATION都存储两个整数,即x和y.

调用这个方法时,我会这样称呼它:

VELOCITY vel;
LOCATION loc;

vel.x = 100.0;
vel.y = 0.0;

loc.x = 10.0;
loc.y = 10.0;

[self addBalloon:Red:vel:loc];
Run Code Online (Sandbox Code Playgroud)

但对我来说,这看起来很混乱.我想在线上创建结构时直接在一行中调用该函数.

这是我的问题:我不确定是否可以使用#define来完成..但如果它不能..是唯一另一个可行的选项,创建一个返回VELOCITY或LOCATION并输入x和y的函数?

我想做类似以下的事情:

[self addBalloon:Red:VELOCITY(100.0, 0.0):LOCATION(10.0, 10.0)];
Run Code Online (Sandbox Code Playgroud)

objective-c

7
推荐指数
1
解决办法
426
查看次数

KVO使用NSMutableArray

我的AppDelegate中有一个名为blocks的NSMutableArray属性.每当一个对象被添加到这个数组时我想观察.我读过其他帖子,但我不明白为什么这不起作用.

在我的app委托类中,我实现了

- (void)insertObject:(id)obj inBlocksAtIndex:(NSInteger)index
{
    [blocks insertObject:obj atIndex:index];
}
Run Code Online (Sandbox Code Playgroud)

在我的视图控制器的init方法中,我将一个观察者添加到我的AppDelegate引用中.

boardModel = [[UIApplication sharedApplication] delegate];
[boardModel addObserver:self forKeyPath:@"blocks" options:0 context:NULL];
Run Code Online (Sandbox Code Playgroud)

在我的视图控制器的viewDidLoad方法中,我尝试调用我之前实现的KVO索引数组访问器,

[boardModel insertObject:[[Block alloc] init] inBlocksAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

然后我实现我的observeValueForKeyPath方法:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"blocks"])
    {
        NSLog(@"ADDED");
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试在observeValueForKeyPath中的if语句之前添加一个NSLog语句,似乎它永远不会被调用.

我也尝试了NSLogging [[boardModel blocks] count],它说计数为1(正在添加对象).

我肯定错过了什么.

objective-c

3
推荐指数
1
解决办法
4946
查看次数

标签 统计

objective-c ×3

ios ×1

model-view-controller ×1