gpt4 book ai didi

iOS subview 最佳实践

转载 作者:行者123 更新时间:2023-11-29 02:56:52 24 4
gpt4 key购买 nike

这就是我所拥有的;一个 ViewController,其根 UIView(子类)具有一个 subview ,即 UISegmentedControlUIView 绘制同心圆,UISegmentedControl 更改这些圆的颜色。为此,我在 ViewControllers loadView 中创建了 UIView 并将其添加到 self.view,然后制作了 UISegmentedControl 并将其添加作为我的 UIView 的 subview 。然后我将 UIView 设置为 UISegmentControl 的目标,并在 UIView 中实现了一个方法来更改颜色并将其设置为操作。这一切都有效。

一些引用代码

//setting up view hierarchy in viewcontroller.m

- (void)loadView{
BNRHypnosisView *backgroundView = [[BNRHypnosisView alloc]init];
self.view = backgroundView;
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc]initWithItems:@[@"Red",@"Green",@"Blue"]];
[segmentedControl addTarget:backgroundView
action:@selector(changeColor:)
forControlEvents:UIControlEventValueChanged];
[backgroundView addSubview:segmentedControl];
}


//action
- (void)changeColor:(UISegmentedControl *)sender{

switch (sender.selectedSegmentIndex) {
case 0:
self.circleColor = [UIColor redColor];
break;

case 1:
self.circleColor = [UIColor greenColor];
break;

case 2:
self.circleColor = [UIColor blackColor];
break;
}
}

所以对于我的问题...在这里我将超 View 视为我的 subview 的 Controller ,这是错误的吗?应该让拥有我的 UIView 的 View Controller 处理所有事情。如果是这样,在这种情况下我怎么能这样做?

-谢谢

如果有人发现它,是的,这是来自 BNR iOS 编程书的挑战之一:]

最佳答案

在 MVC 中这是错误的。正如你所说,你对 Controller 做了一个 View ,但这永远不应该。您的目标应该是使大多数类独立于其他类(松散耦合)。

在您的情况下,您应该将所有代码,尤其是目标操作代码移动到 View Controller 。将操作更改为 viewDidLoad 中的 viewController:

[segmentedControl addTarget:self
action:@selector(changeColor:)
forControlEvents:UIControlEventValueChanged];
[backgroundView addSubview:segmentedControl];

并将changeColor方法移至 View Controller ,并将该方法的发送者强制转换为UISegmented控件:

- (void)changeColor:(id)sender{

UISegmentedControl *segControl = (UISegmentedControl *) sender;

switch (segControl.selectedSegmentIndex) {
case 0:
circleView.circleColor = [UIColor redColor];
break;

case 1:
circleView.circleColor = [UIColor greenColor];
break;

case 2:
circleView.circleColor = [UIColor blackColor];
break;
}
}

要实现此功能,您需要为circleView 提供一个属性,因此在 View Controller 中创建一个属性,并在创建circleView 时将其分配给该属性。

@proprety (nonatomic, strong) BNRHypnosisView *circleView;

并在您的 loadView: 方法中:

- (void)loadView{
self.circleView = [[BNRHypnosisView alloc]init];
self.view = self.circleView;

关于iOS subview 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23775204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com