سؤال

يحتوي بروتوكول UIAlertviewDelegate على عدة طرق اختيارية بما في ذلك:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;

يبدو أن هذا يشير إلى أنه ليست كل النقرات على الأزرار تؤدي فعليًا إلى استبعاد عرض التنبيه.ومع ذلك، لا أرى أي طريقة لتكوين عرض التنبيه بحيث لا يتم استبعاده تلقائيًا بمجرد الضغط على الزر.

هل يجب علي إنشاء فئة فرعية لإنجاز ذلك؟

لماذا يحتوي بروتوكول UIAlertViewDelegate على:

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex;
- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex

و

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;

إذا لم يكن يدعم بشكل اختياري عدم رفض عرض التنبيه مع كل نقرة على الزر؟

جانبا موجزا:أدرك الغرض من تصميم UIAlertView.لكن هدفي هو السماح للمستخدم بنسخ بعض النص إلى لوحة اللصق قبل خروج التطبيق (والذي يحدث تلقائيًا عند رفض عرض التنبيه.

هل كانت مفيدة؟

المحلول

نعم.فئة فرعية UIAlertView ومن ثم الزائد -dismissWithClickedButtonIndex:animated:, ، على سبيل المثال.

@implementation MyAlertView 
-(void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated {
   if (buttonIndex should not dismiss the alert)
      return;
   [super dismissWithClickedButtonIndex:buttonIndex animated:animated];
}
@end

بشكل غير رسمي يمكنك تحديد أ

-(void)alertSheet:(UIAlertSheet*)sheet buttonClicked:(id)button;

طريقة للمفوض الذي سيجعل من التجاوز -dismissWithClickedButtonIndex:animated:, ، ولكنها غير موثقة, ، لذلك لا أعرف ما إذا كان مناسبًا لك.

نصائح أخرى

willPresentAlertView:, didPresentAlertView:, alertView:willDismissWithButtonIndex:, ، و alertView:didDismissWithButtonIndex: مخصصة لتتبع بداية ونهاية الرسوم المتحركة لـ UIAlertView.

يمكن للتطبيقات التي لا تحتاج إلى تتبع الرسوم المتحركة لـ UIAlertView أن تستخدمها ببساطة alertView:clickedButtonAtIndex:.تقول المستندات الخاصة بهذه الطريقة "يتم رفض جهاز الاستقبال تلقائيًا بعد استدعاء هذه الطريقة."

في رأيي:لا يوجد سبب للاحتفاظ بحالة التنبيه.حتى إذا كنت تريد الاحتفاظ به، فكر فقط في "إعادة إظهاره"، عن طريق الاحتفاظ بمرجع، ثم اتصل بـ [alertView show] ==> لا حاجة إلى أي شيء فرعي.أخبار جيدة، هاه؟

تحذير

من بعض المصادر التي سمعت أن القليل من التطبيق قد تم رفضه بعد هذه العملية.كنت محظوظًا في حالتي خلال iOS6 ، لذا أعرض رمزًا هنا.استخدمها على مسؤوليتك الخاصة :-/

التصنيف الفرعي هو أفضل طريقة.إنشاء bool يجب أن تبقى علامة التنبيه أم لا.

هذه هي الفئة الفرعية من UIAlertView

//
//  UICustomAlertView.h
//

#import <UIKit/UIKit.h>

@interface UICustomAlertView : UIAlertView
{

}
@property(nonatomic, assign) BOOL dontDisppear;
@end

//
//  UICustomAlertView.m
//

#import "UICustomAlertView.h"

@implementation UICustomAlertView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

-(void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated {

    if(self.dontDisppear)
        return;
    [super dismissWithClickedButtonIndex:buttonIndex animated:animated];
}
@end

وهذه هي الطريقة التي استخدمتها في الكود الخاص بي

if(![txtUsername.text isEqualToString:@"admin"] && ![txtPassword.text isEqualToString:@"admin"])
{
     alertLogin.dontDisppear = YES;
     alertLogin.message = NSLocalizedString(@"my_alert", nil);
}
else
{
     alertLogin.dontDisppear = NO;
     // proceed
}
#import "MLAlertView.h"

@implementation MLAlertView


-(void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated {
}

-(void)dismissNow:(NSInteger)buttonIndex  {
     [super dismissWithClickedButtonIndex:buttonIndex animated:YES];
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top