使用自定义 AlertView - Window 层次结构?

Using custom AlertView - Window Hierarchy?

所以我一直在构建一个应用程序,它使用我在 another question 中找到的自定义 AlertView。

完整代码可以在 Github 上找到。

具体来说,CustomiOSAlertView.m可以找到HERE

这就是我创建视图的方式,我调用 以显示附加到 UIStoryboard 中的 UIImage 的 IBAction 的警报,这是操作:

- (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 的回答,您没有在 "Main Interface" 的下拉选项卡菜单中选择故事板...将其留空,为我工作,现在实例化故事板AppDelegate 并在调用时在 UIStoryboard 顶部创建一个 AlertView。

在我看来,您在 实例化故事板之前在 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