iOS中多个UIView的UIView继承
UIView inheritance for multiple UIView in iOS
我正在尝试构建一个简单的 iOS 应用程序,它可以简单地掷不同面数的骰子(d20、d12 等...)
我想创建一个视图,我将在同一个 UIViewController 中重复使用多次,如下所示:http://cl.ly/image/2s30353F3V1K(唯一改变的是 # of边)
我想不通的是如何在故事板中正确创建 UI 元素,而不是简单地为每个不同的边数复制和粘贴 ContainerView 的嵌入对象。
有没有简单的方法可以正确地 class 子?我是 iOS 故事板的新手,正在尝试使用 OO 原则。
我不是很清楚你的问题,但我有一个想法
首先,你得到了一个 UIViewController
YourViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"Identifier"];
[vc methodToChangeTheSideProperty:(NSString *)side];
CGRect frame = vc.view.frame;
//change frame of the view as you want
...
...
vc.view.frame = frame;
然后,将控制器的视图添加到要显示的容器中
[yourViewContainer addSubview:vc.view];
所以你有一个DieViewController
,但你需要不同的实例有不同的边数。
@interface DieViewController
…
@property (nonatomic) NSInteger numberOfSides;
…
@end
问题是如何将适当数量的面传达给每个包含的实例。这就是嵌入转场的用武之地。在故事板中,将故事板嵌入转场标识符设置为唯一的东西(我将使用 6SidedDie
)。最后,在ViewController
中添加一个-prepareForSegue:sender:
@@implementation ViewController
…
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"6SidedDie"]) {
DieViewController *dieViewController = segue.destinationViewController;
dieViewController.numberOfSides = 6;
}
}
…
@end
当然,您可以将其混合使用以允许有很多骰子。这是可以处理标识符 6SidedDie
和 10SidedDie
.
的代码
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier hasSuffix:@"Die"]) {
DieViewController *dieViewController = segue.destinationViewController;
if ([segue.identifier hasPrefix:@"6Sided"]) {
dieViewController.numberOfSides = 6;
} else if ([segue.identifier hasPrefix:@"10Sided"]) {
dieViewController.numberOfSides = 10;
}
}
}
更新
您可以使用 self.viewControllers
数组访问 DieViewController
个实例中的内容。
DieViewController *dieViewController = self.viewControllers[0]; // The first die view controller
if (dieViewController.numberOfSides == 6) {
// This is the six sided die.
}
注意:self.viewControllers
将不会被订购。您需要检查 numberOfSides
以了解这是哪种类型的骰子。
我正在尝试构建一个简单的 iOS 应用程序,它可以简单地掷不同面数的骰子(d20、d12 等...)
我想创建一个视图,我将在同一个 UIViewController 中重复使用多次,如下所示:http://cl.ly/image/2s30353F3V1K(唯一改变的是 # of边)
我想不通的是如何在故事板中正确创建 UI 元素,而不是简单地为每个不同的边数复制和粘贴 ContainerView 的嵌入对象。
有没有简单的方法可以正确地 class 子?我是 iOS 故事板的新手,正在尝试使用 OO 原则。
我不是很清楚你的问题,但我有一个想法
首先,你得到了一个 UIViewController
YourViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"Identifier"];
[vc methodToChangeTheSideProperty:(NSString *)side];
CGRect frame = vc.view.frame;
//change frame of the view as you want
...
...
vc.view.frame = frame;
然后,将控制器的视图添加到要显示的容器中
[yourViewContainer addSubview:vc.view];
所以你有一个DieViewController
,但你需要不同的实例有不同的边数。
@interface DieViewController
…
@property (nonatomic) NSInteger numberOfSides;
…
@end
问题是如何将适当数量的面传达给每个包含的实例。这就是嵌入转场的用武之地。在故事板中,将故事板嵌入转场标识符设置为唯一的东西(我将使用 6SidedDie
)。最后,在ViewController
中添加一个-prepareForSegue:sender:
@@implementation ViewController
…
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"6SidedDie"]) {
DieViewController *dieViewController = segue.destinationViewController;
dieViewController.numberOfSides = 6;
}
}
…
@end
当然,您可以将其混合使用以允许有很多骰子。这是可以处理标识符 6SidedDie
和 10SidedDie
.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier hasSuffix:@"Die"]) {
DieViewController *dieViewController = segue.destinationViewController;
if ([segue.identifier hasPrefix:@"6Sided"]) {
dieViewController.numberOfSides = 6;
} else if ([segue.identifier hasPrefix:@"10Sided"]) {
dieViewController.numberOfSides = 10;
}
}
}
更新
您可以使用 self.viewControllers
数组访问 DieViewController
个实例中的内容。
DieViewController *dieViewController = self.viewControllers[0]; // The first die view controller
if (dieViewController.numberOfSides == 6) {
// This is the six sided die.
}
注意:self.viewControllers
将不会被订购。您需要检查 numberOfSides
以了解这是哪种类型的骰子。