0

Reveal コントロールを使用する必要がある新しい iOS アプリから始めています。そこで、優れた ZUUIRevealController ライブラリを使用することを計画しました。2 ~ 3 画面の UI を作成しました。それらの画面の 1 つで、UIAlertView と UIActionsheet を表示する必要があります。しかし、UIAlertView と UIActionsheet の表示が非常に遅いことに気付きました(最初に黒いオーバーレイを追加してから、UIAlertView/UIActionsheet を表示します。表示中に一種のアラート ビューがハングします。アニメーションはスムーズではありません)。UI を作成しただけで、コーディングのためのロジックは追加しませんでした。バックグラウンド スレッド / dispatch_asyn() は使用しませんでした。したがって、バックグラウンド スレッドから UI を更新する問題はありません。そこで、メモリリークと割り当てを確認しました。メモリ リークは見られませんでしたが、メニューを表示して新しいビュー コントローラをプッシュしている間、メモリ割り当てが増加し続けます。ビューコントローラーをポップしても減少しません。スクリーンショットは次のとおりです。

1) アプリ起動時 ここに画像の説明を入力

2)しばらくして、新しいView Controllerを押すと、View Controllerがポップされます

ここに画像の説明を入力

メニューから行を選択するたびに、ZUUIRevealControllerライブラリがView Controllerの新しいインスタンスを作成することを知っています。そのため、View Controller のインスタンス変数を .h ファイルに作成しましたが、それでも同じ問題があります。

これが私のコードです

// AppDelegate.m // SplashViewController で、メニューまたはログイン画面を表示するかどうかを決定します

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.splashViewController = [[SplashViewController alloc]initWithNibName:@"SplashViewController" bundle:nil];
    self.window.rootViewController = self.splashViewController;

    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    [self customizeUIControlsAppearance];
    return YES;
}

// SplashViewController.m

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    BOOL isLoggedIn = YES;
    if(isLoggedIn){
        [self showMenuViewController];
    }
    else{
        [self showStartUpViewController];
    }
}

-(void)showStartUpViewController
{
    StartUpViewController *startUpViewController = [[StartUpViewController alloc]initWithNibName:@"StartUpViewController" bundle:nil];
    UINavigationController *navController=[[UINavigationController alloc] initWithRootViewController:startUpViewController];
    [self presentViewController:navController animated:NO completion:^{

    }];
}

-(void)showMenuViewController
{
    MenuViewController *menuViewController=[[MenuViewController alloc] init];
    CategoryViewController *categoryViewController=[[CategoryViewController alloc]initWithNibName:@"CategoryViewController" bundle:nil];
    categoryViewController.isViewControllerShownFromMenu = YES;
    UINavigationController *navController=[[UINavigationController alloc] initWithRootViewController:categoryViewController];
    RevealController *revealController=[[RevealController alloc] initWithFrontViewController:navController rearViewController:menuViewController];
    [self presentViewController:revealController animated:NO completion:^{

    }];
}

// MenuViewController.m

// SettingsViewController と NewsViewController は、プロパティと syntheszie を使用して .h ファイルにデカールされます

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    RevealController *revealController = [self.parentViewController isKindOfClass:[RevealController class]] ? (RevealController *)self.parentViewController : nil;

    // Switch using Section Number
    switch (indexPath.section) {
        case OTHER_SECTION:
            switch (indexPath.row) {
                case NEWS:
                    [self showNewsViewControllerUsingRevealController:revealController];
                    break;
                case SETTINGS:
                    [self showSettingsViewControllerUsingRevealController:revealController];
                    break;
                default:
                    break;
            }
            break;
        default:
            break;
    }

}

#pragma mark - Show News & Settings View Controllers

-(void)showNewsViewControllerUsingRevealController:(RevealController*)revealController
{
    if ([revealController.frontViewController isKindOfClass:[UINavigationController class]] && ![((UINavigationController *)revealController.frontViewController).topViewController isKindOfClass:[NewsViewController class]])
    {
        if(!self.newsViewController)
            self.newsViewController = [[NewsViewController alloc] initWithNibName:@"NewsViewController" bundle:nil];
        self.newsViewController.isViewControllerShownFromMenu = YES;
        UINavigationController *navigationController= [[UINavigationController alloc] initWithRootViewController:self.newsViewController];

        [revealController setFrontViewController:navigationController animated:NO];
    }
    else
    {
        [revealController revealToggle:self];
    }
}

-(void)showSettingsViewControllerUsingRevealController:(RevealController*)revealController
{
    if ([revealController.frontViewController isKindOfClass:[UINavigationController class]] && ![((UINavigationController *)revealController.frontViewController).topViewController isKindOfClass:[SettingsViewController class]])
    {
        if(!self.settingsViewController)
            self.settingsViewController= [[SettingsViewController alloc] initWithNibName:@"SettingsViewController" bundle:nil];
        self.settingsViewController.isViewControllerShownFromMenu = YES;
        UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:self.settingsViewController];

        [revealController setFrontViewController:navigationController animated:NO];
    }
    else
    {
        [revealController revealToggle:self];
    }
}

// UIAlertView と UIActionsheet を表示するためのコード

-(void)showAlertWithTitle:(NSString*)title andMessage:(NSString*)message
{
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:title message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
    [alert show];
}

-(void)btnInviteTapped:(id)sender event:(UIEvent*)event
{
    UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:NSLocalizedString(@"FRIENDS_VC:INVIT_ACTIONSHEET_TITLE", nil) delegate:self cancelButtonTitle:NSLocalizedString(@"FRIENDS_VC:ACTIONSHEET_CANCEL_BUTTON",nil) destructiveButtonTitle:nil otherButtonTitles:NSLocalizedString(@"FRIENDS_VC:ACTIONSHEET_SMS_BUTTON",nil),NSLocalizedString(@"FRIENDS_VC:ACTIONSHEET_EMAIL_BUTTON",nil), nil];
    actionSheet.actionSheetStyle = UIActionSheetStyleBlackTranslucent;
    [actionSheet showInView:self.view];
}

ちなみにメニューは11品

私の Login & Regsiter フローは MenuViewController に埋め込まれていません。Login & REgsiter では、UIAlertView & UIActionSheet がスムーズに表示されます。

ここで何がうまくいかないのですか?コーディングを間違えましたか? UIAlertView と UIActionsheet がスムーズに表示されないのはなぜですか? どんな種類の助けも大歓迎です。ありがとう。

4

0 に答える 0