【发布时间】:2015-09-09 18:19:22
【问题描述】:
所以我一直在构建一个使用我在 another question 中找到的自定义 AlertView 的应用程序。
完整的代码可以在Github找到。
具体来说,CustomiOSAlertView.m 可以找到HERE。
这就是我创建视图的方式,我调用它来显示警报表单IBAction 附加到 UIStoryboard 中的 UIImage,这是操作:
- (IBAction)Button1:(id)sender {
NSString *name = @"info";
NSString *content = @"info 2";
NSString *info = @"more info";
NSString *imageLink = @"image.png";
NSString *stringContent = [NSString stringWithFormat:@" %@\n\n %@\n\n %@", name, content, info];
[self ConstructAlertContent:imageLink :stringContent];
}
调用它(使用上面附加的 CustomiOSAlertView.m):
-(void)ConstructAlertContent:(NSString *)imgStr :(NSString *)str{
NSString *imageLink = imgStr;
NSString *stringContent = str;
// Here we need to pass a full frame
CustomIOSAlertView *alertView = [[CustomIOSAlertView alloc] init];
// Add some custom content to the alert view with above method createDemoView()
[alertView setContainerView:[self createDemoView:imageLink : stringContent]];
// Modify the parameters
[alertView setButtonTitles:[NSMutableArray arrayWithObjects:@"Done", nil]];
[alertView setDelegate:self]; //add to .h: <CustomIOSAlertViewDelegate>
// You may use a Block, rather than a delegate.
[alertView setOnButtonTouchUpInside:^(CustomIOSAlertView *alertView, int buttonIndex) {
//NSLog(@"Block: Button at position %d is clicked on alertView %d.", buttonIndex, (int)[alertView tag]);
[alertView close];
}];
//allow alert to move with phone motion
[alertView setUseMotionEffects:true];
//set alert alpha to slightly transparent
[alertView setAlpha:0.94];
// And launch the dialog
[alertView show];
}
并像这样创建视图:
- (UIView *)createDemoView:(NSString *)imgStr :(NSString *)str
{
UIView *demoView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 290, 300)];
//include image
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(70, 10, 150, 180)];
[imageView setImage:[UIImage imageNamed:imgStr]];
[demoView addSubview:imageView];
//... with additional subviews
return demoView;
}
在我创建单独的 UIStoryboard 并在 AppDelegate.m 中使用以下代码为特定设备实例化正确的故事板之前,它一直运行良好:
if (iOSScreenSize.height == 480){ //iPhone 3.5"
//instantiate storyboard for iPhone4S
UIStoryboard *iPhone35Storyboard = [UIStoryboard storyboardWithName:@"iPhone35" bundle:nil];
UIViewController *initialViewcontroller = [iPhone35Storyboard instantiateInitialViewController];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = initialViewcontroller;
[self.window makeKeyAndVisible];
}
if (iOSScreenSize.height == 568){ //iPhone 4"
//instantiate storyboard for iPhone 5S
UIStoryboard *iPhone4Storyboard = [UIStoryboard storyboardWithName:@"iPhone4" bundle:nil];
UIViewController *initialViewcontroller = [iPhone4Storyboard instantiateInitialViewController];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = initialViewcontroller;
[self.window makeKeyAndVisible];
}
if (iOSScreenSize.height == 667){ //iPhone 4.7"
//instantiate storyboard for iPhone 6
UIStoryboard *iPhone47Storyboard = [UIStoryboard storyboardWithName:@"iPhone47" bundle:nil];
UIViewController *initialViewcontroller = [iPhone47Storyboard instantiateInitialViewController];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = initialViewcontroller;
[self.window makeKeyAndVisible];
}
if (iOSScreenSize.height == 736){ //iPhone 5.5"
//instantiate storyboard for iPhone 6+
UIStoryboard *iPhone55Storyboard = [UIStoryboard storyboardWithName:@"iPhone55" bundle:nil];
UIViewController *initialViewcontroller = [iPhone55Storyboard instantiateInitialViewController];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = initialViewcontroller;
[self.window makeKeyAndVisible];
}
现在,当我在(模拟器和设备上)测试应用程序时,它会加载正确的故事板和内容,但不显示自定义的 AlertView...只要我注释掉上面的代码(以实例化特定的故事板),然后运行应用程序,自定义 AlertViews 再次工作...
我猜这与视图层次结构有关?即使像我使用上面的代码那样手动实例化故事板,是否也可以让它出现?
编辑
请确保,使用下面 Rob 的答案,您没有在“主界面”的下拉选项卡菜单中选择故事板...将其留空,对我有用,现在从 AppDelegate 实例化故事板和调用时还会在 UIStoryboard 顶部创建一个 AlertView。
【问题讨论】:
-
将 demoView 添加到视图层次结构的代码在哪里?另外,你重复了这么多代码,为什么不在屏幕大小上使用 switch/if-else 语句,有条件地选择故事板并编写所有重复的代码一次?
-
我已经更新了我的问题以包含指向 .m... (github.com/wimagguc/ios-custom-alertview/blob/master/…) 的链接,并且我使用了 youtube 教程中的代码,直到我对 iOS 编程充满信心。谢谢。
-
我的意思是你在哪里调用代码来显示警报视图?您尚未在实际显示警报的位置发布代码,因此很难调试为什么它没有出现。
-
@Jeff 只需按下 IBAction 按钮即可;我已经在底部更新了我的问题...
标签: ios objective-c cocoa-touch uistoryboard hierarchy