0

このプロジェクトはgithubから取得しました。

カスタム AlertView です。私はそれがどのように機能するかを理解しました。このように、私のプロジェクト用に変更しました

ここに画像の説明を入力

Course1 - 商品の名前、「1」はその金額です。プラス/マイナスを入力していると、金額が増減します。しかし、それは私の変数に対してのみ機能します(この変数を表示すると、この AlertView に読み込まれ、1 になります)。var (金額) を変更して、このアラート ビューのメッセージをリロードするにはどうすればよいですか。理解できません。ここに私のコード。

私のクラスでは、このコードでアラートビューを呼び出します

BlockAlertView *alert = [BlockAlertView alertWithTitle: title message:ac.acCount];

[alert setCancelButtonWithTitle:@"-" block:nil];
[alert setDestructiveButtonWithTitle:@"+" block:^{
            int u = [ac.acCount intValue];
            u++;
            ac.acCount = [NSString stringWithFormat:@"%d", u];
            NSLog(@"%d", u);
        }];
        [alert addButtonWithTitle:@"Ok" block:^{
            NSMutableArray *container = [[NSMutableArray alloc] init];
            [container addObject:title];
            [container addObject:price];
            [container addObject:bId];
            [container addObject:ac.acCount];
            [container addObject:depid];
            [[NSNotificationCenter defaultCenter] postNotificationName:@"MyNotification" object:container];
        }];
        [alert show];

Show メソッドは、alertWithTitle: title message:ac.acCount から取得したパラメーターを使用してアラート ビューを描画するだけです。ここにコードがあります

+ (BlockAlertView *)alertWithTitle:(NSString *)title message:(NSString *)message
 {
    return [[[BlockAlertView alloc] initWithTitle:title message:message] autorelease];
 }

ここは

- (id)initWithTitle:(NSString *)title message:(NSString *)message 
{
NSLog(@"title - %@ message - %@", title, message);

if ((self = [super init]))
{
    UIWindow *parentView = [BlockBackground sharedInstance];
    CGRect frame = parentView.bounds;
    frame.origin.x = floorf((frame.size.width - background.size.width) * 0.5);
    frame.size.width = background.size.width;

    _view = [[UIView alloc] initWithFrame:frame];
    _blocks = [[NSMutableArray alloc] init];
    _height = kAlertViewBorder + 6;

    if (title)
    {
        CGSize size = [title sizeWithFont:titleFont
                        constrainedToSize:CGSizeMake(frame.size.width-kAlertViewBorder*2, 1000)
                            lineBreakMode:UILineBreakModeWordWrap];

        UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(kAlertViewBorder, _height, frame.size.width-kAlertViewBorder*2, size.height)];
        labelView.font = titleFont;
        labelView.numberOfLines = 0;
        labelView.lineBreakMode = UILineBreakModeWordWrap;
        labelView.textColor = kAlertViewTitleTextColor;
        labelView.backgroundColor = [UIColor clearColor];
        labelView.textAlignment = UITextAlignmentCenter;
        labelView.shadowColor = kAlertViewTitleShadowColor;
        labelView.shadowOffset = kAlertViewTitleShadowOffset;
        labelView.text = title;
        [_view addSubview:labelView];
        [labelView release];

        _height += size.height + kAlertViewBorder;
    }

    if (message)
    {
        CGSize size = [message sizeWithFont:messageFont
                          constrainedToSize:CGSizeMake(frame.size.width-kAlertViewBorder*2, 1000)
                              lineBreakMode:UILineBreakModeWordWrap];

        UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(kAlertViewBorder, _height, frame.size.width-kAlertViewBorder*2, size.height)];
        labelView.font = messageFont;
        labelView.numberOfLines = 0;
        labelView.lineBreakMode = UILineBreakModeWordWrap;
        labelView.textColor = kAlertViewMessageTextColor;
        labelView.backgroundColor = [UIColor clearColor];
        labelView.textAlignment = UITextAlignmentCenter;
        labelView.shadowColor = kAlertViewMessageShadowColor;
        labelView.shadowOffset = kAlertViewMessageShadowOffset;
        labelView.text = message;
        [_view addSubview:labelView];
        [labelView release];

        _height += size.height + kAlertViewBorder;
    }

    _vignetteBackground = NO;
}

return self;

}

私はこのようなものを使用しようとしました

-(void)reloadAlertView: (NSString *) title: (NSString *) message{
[self initWithTitle:title message:message];
}

アラートビューを表示するクラスからこれを呼び出します。

[alert reloadAlertView: title: newMessage];
4

2 に答える 2

1

CustomAlertView.h で新しいラベルを参照する必要があります

@property (nonatomic, strong) IBOutlet UILabel *mylab;

次に、CustomAlertView.h クラスのオブジェクトによって、このラベルのプロパティを取得できます。

BlockAlertView *alert ...;
alert.mylab.text = @"hello";
于 2013-06-18T10:21:10.630 に答える
0
  1. BlockAlertView.mボタンがクリックされるたび+に、アラートが消え、再び表示されます。

ViewController.m

@implementation ViewController {


        BlockAlertView *alert ;
        NSInteger value;
    }

    -(void) viewDidLoad {
      value = 0;


        [self reloadAlert];


    }


    -(void) reloadAlert {
        value += 1;


        __block ViewController* _self = self;
        alert = [[BlockAlertView alloc] initWithTitle:@"Course1" message:[[[NSNumber alloc] initWithInteger:value ] stringValue]];


        [alert setDestructiveButtonWithTitle:@"PLUS" block:^{

            [_self reloadAlert];


        }];
        [alert show];

    }
   } 
  1. AlertViewsolution 、ポップアップせずに残りを保持したい場合。

a. からアクセスできるように外部にBlockAlertView.h持ち出すように変更して、後でメッセージを再描画できるようにします。messageLabelViewViewController

BlockAlertView.h

@interface BlockAlertView  { 
...
}
@property (nonatomic, retain) UILabel *messageLabelView;

必要に応じて、代わりにUIView *_view out@protectedと into を持ち込むこともできます。@propertyその場合、messageLabelView_view のサブビュー経由でアクセスできます

b. ボタンに署名する場合に関数が呼び出されないように変更BlockAlertView.m dismissWithClickedButtonIndex:animated:します -にハードコードされます。removeViewbuttonIndex == PLUSbuttonIndex0

PLUSボタンのブロックobj内で実行スレッドを停止するためのより良いオプションがあるかもしれませんが、私はその方法を知りません:)

c. メッセージ ラベルのレンダリング中にへBlockAlert.m initWithTitle:message:の参照を追加するように変更します。messageLabelViewlabelView

BlockAlertView.m

@synthesize messageLabelView;



     - (id)initWithTitle:(NSString *)title message:(NSString *)message 
    {
     ...
    // code to initialize messageLabelView
     if (message)
            {

               .... 
                // code to render labelView for message. add reference to messageLabelView
                 messageLabelView = labelView;
                  // [labelView release];


            }
    }

    - (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated 
    {
        if (buttonIndex >= 0 && buttonIndex < [_blocks count])
        {
            id obj = [[_blocks objectAtIndex: buttonIndex] objectAtIndex:0];
            if (![obj isEqual:[NSNull null]])
            {
                ((void (^)())obj)();
            }
        }

    // there may be a better option to stop the execution thread inside the block obj above
        if(buttonIndex == 0) {// or whatever index of Plus Button, dont removeView
            return;
        }

    // code to removeView below, keep as usual
        if (animated)
        {
           ...
        }
        else
        {
        ....
        }
    }
}

d. reloadAlert を変更ViewController.m

ViewController.m

-(void) reloadAlert {

    value += 1;

    alert.messageLabelView.text = [[[NSNumber alloc] initWithInteger:value ] stringValue];
    [alert.messageLabelView setNeedsDisplay];
} 
于 2013-04-23T05:41:04.417 に答える