【问题标题】:Using custom AlertView - Window Hierarchy?使用自定义 AlertView - 窗口层次结构?
【发布时间】: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


【解决方案1】:

在我看来,您是在 实例化情节提要之前调用 AppDelegate 中的自定义视图方法。

您应该先实例化情节提要,然后从正确情节提要的控制器中调用该方法。

例如:

AppDelegate:

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];
}

InitialViewController.m

-(void)viewDidAppear(Bool animated){

  [super animated:animated];

  [self createDemoView:"myImage.png" str:"Custom Alert"]'

}

编辑:在此处添加示例代码:https://github.com/robcontreras/CustomAlert

【讨论】:

  • 如何在 IBAction 按钮中实现这一点?我对所有故事板都有相同的 ViewController... 我认为 AppDelegate 在 ViewController 中的任何内容之前完成了它的工作?
  • 对,但是请注意,如果您在呈现故事板之前调用自定义视图创建方法,那么故事板将位于堆栈的顶部,而不是您想要的自定义警报,你想要的是当有人按下按钮时有一个自定义警报,对吧?然后在 initialViewController 中,您需要一个 IBAction,就像您在后期编辑中拥有的那样,然后确保它链接到故事板按钮中的“Touch Up Inside”事件
  • 这就是我所拥有的......应用程序在所有设备上运行,启动应用程序,打开正确的故事板,然后我可以滚动页面并按下按钮......除非我完全误会你了……在情节提要出现之前,我无法按下按钮……
  • 如果你能做一些很棒的东西......如果你只是创建一个空白的 xCode 故事板,具有 2 个设备大小的 UIStoryboard 并像我上面那样在 AppDelegate 中加载正确的故事板,然后使用github中的Custom AlertView .h和.m以及我上面的代码,你会看到:(
  • 非常感谢您发布此信息。您的版本运行良好......我将不得不尝试看看我们的项目之间有什么不同......这一定是我实例化故事板的方式,正如你所说,我想。感谢我们的帮助。
猜你喜欢
  • 2014-11-17
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
相关资源
最近更新 更多