2009-02-11 16 views
8

devre dışı bırakma: Bir ebeveyn ve bir alt görünümünü. aşağıdaki gibi alt görünümde ben sağ köşesinde bir düğme ekleyerek ediyorum:imajını değiştirmek ve iki bakan bir NavigationBar uygulaması var UIBarButtonItem

o düğme ben denetleyicisi tarafından otomatik olarak eklenmiştir leftBarButtonItem (bu rightBarButtonItem imajını değiştirme ve devre dışı bırakmak istiyor tıklandığında
- (void)viewDidLoad { 
    UIBarButtonItem *tempButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"lock-unlocked.png"] style:UIBarButtonItemStylePlain target:self action:@selector(lockScreen)]; 
    self.navigationItem.rightBarButtonItem = tempButton; 
    [tempButton release]; 
} 

). Temelde iki düğme bir durumu vardır, kilitlenir ve kilidi açılır.

Soru 1: Görüntünün nasıl değiştirileceğini bulabilmemin tek yolu, yeni bir resme sahip yeni bir UIButtonItem oluşturmak ve bu yeni olan ile rightBarButtonItem öğesini değiştirmek. Sadece yeni UIBarButtonItem oluşturmadan görüntüyü değiştirmek için bir yolu olup olmadığını Ama merak ediyorum. Yeni UIBarButtonItem oluşturmaya devam edersem bellek sızıntısı mı oluyorum?

Soru 2: nasıl self.navigationItem.leftBarButtonItem ve devre dışı bir tutun alabilirsiniz/etkinleştirmek? Onu manuel olarak oluşturmadım, kontrolör tarafından benim için otomatik olarak oluşturuldu. Onunla devre dışı/kullanıcı etkileşimini sağlamak için UIBarButtonItem üzerinde herhangi bir yöntem/özellik görmüyorum.

cevap

18

Soru 1: arayüzüne

@interface MyAppDelegate : NSObject <UIApplicationDelegate> { 
    UIBarButtonItem *tempButton; 
} 

@property (nonatomic, retain) UIBarButtonItem *tempButton; 

yılında UIBarButtonItem * tempButton bildirmek ve uygulanmasında sentezlemek.

@synthesize tempButton; 

Nesnenin nasıl oluşturulduğuna benzer şekilde viewDidLoad içinde oluşturun.

- (void)viewDidLoad { 
    tempButtom = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"lock-unlocked.png"] style:UIBarButtonItemStylePlain target:self action:@selector(lockScreen)]; 
    self.navigationItem.rightBarButtonItem = tempButton; 
} 

Ama burada bırakın normalde altta bulunan dealloc yönteminde bırakın yoktur. Sonra Lockscreen denir

tempButton.image = [UIImage imageNamed:@"myImage.png"] 

yaparım Soru 2 için bir cevabım yok, im korkmuş! sen aramak gerekir geri düğmesini devre dışı bırakmayı

self.navigationItem.leftBarButtonItem.enabled = NO; 
+1

Bu yaklaşım daha iyi görünüyor. Teşekkürler! –

+3

Üçüncü kod parçası için küçük bir sorun: bir özellik olarak bildirdiğinizde zaten muhafaza edildiği için tempButton'u serbest bırakabilirsiniz. –

+0

aslında iPhoney. çünkü self.tempButton'u çağırmadı, özellik korunmaz. özelliği korumak sadece self.VAR kullanırsanız tetiklenebilir. –

7

self.navigationItem.hidesBackButton = YES; 
5

Sana bir NavigationController varsa anlıyoruz, fakat bu durumda olamaz: 'etkin' özelliğini kullanın 2. soruya bağlamda

+0

Düğmeyi devre dışı bırakmak yerine bu gizleme olmaz mı? –

0

I/devre dışı olan bir NavBar düğme grileştirebilir mümkün değildi:

self.navigationItem.leftBarButtonItem.enabled = NO; 

... ama gizleme geri düğmesi iyi çalışıyor!

self.navigationItem.hidesBackButton = YES; 

Teşekkürler Dzamir! Kullanılması

0

istediğimiz bu değil butonuna HIDES neden "hidesBackButton = EVET", gerçekten zarif bir çözüm değildir. Kabul edilebilir bir-etrafında çalışma sadece en az butonuna dokunuşları devre dışı bırakılması arka düğmenin üzerine pencereye bir UILabel eklemek.

sizin AppDelegate sınıfına bu yöntemi ekleyin:

- (void) disableLeftBarButtonItemOnNavbar:(BOOL)disable 
{ 
    static UILabel *l = nil; 

    if (disable) { 
     if (l != nil) 
      return; 
     l = [[UILabel alloc] initWithFrame:CGRectMake(0, 20, 160, 44)]; 
     l.backgroundColor = [UIColor clearColor]; 
     l.userInteractionEnabled = YES; 
     [self.window addSubview:l]; 
    } 
    else { 
     if (l == nil) 
      return; 
     [l removeFromSuperview]; 
     [l release]; 
     l = nil; 
    } 
} 

herhangi görünüm denetleyicisinden böyle diyebilirsin devre dışı bırakmak için:

MyAppDelegate *appDeleg = (MyAppDelegate *) [[UIApplication sharedApplication] delegate]; 
[appDeleg disableLeftBarButtonItemOnNavbar:YES]; 

etkinleştirmek için:

MyAppDelegate *appDeleg = (MyAppDelegate *) [[UIApplication sharedApplication] delegate]; 
[appDeleg disableLeftBarButtonItemOnNavbar:NO]; 
1

olmamalı Yukarıdakiler [self.window addSubView: l] çağrısından sonra UILabel * l sürümünü serbest bıraktı mı? Böylece Subview'e eklendiğinde +1 korunur, ancak aynı dalda -1 serbest bırakılır. Aksi takdirde, devre dışı bırakmak için disableLeftBarButtonItemOnNavbar: NO işlevini çağırmalısınız. Ve sonunda, sonunda aynı yerde olursun, sızmıyorsun, sanırım XCode'a inşa ettikleri statik analiz araçları, ayrı bir dalda olmaktan hoşlanmıyor. Bu kod size yardımcı olur düşünmek

- (void) disableLeftBarButtonItemOnNavbar:(BOOL)disable 
{ 
    static UILabel *l = nil; 

    if (disable) { 
     if (l != nil) 
      return; 
     l = [[UILabel alloc] initWithFrame:CGRectMake(0, 20, 160, 44)]; 
     l.backgroundColor = [UIColor clearColor]; 
     l.userInteractionEnabled = YES; 
     [self.window addSubview:l]; 
     [l release]; 
    } 
    else { 
     if (l == nil) 
      return; 
     [l removeFromSuperview]; 
     l = nil; 
    } 
} 
0

:-) Küçük detay,

UIButton *m_objbtnFlip= [[UIButton alloc] initWithFrame:CGRectMake(0,0,89, 37)]; 
    [m_objbtnFlip setBackgroundImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"btn_purchased" 
                           ofType:IMAGETYPE]] 
         forState:UIControlStateNormal]; 
    [m_objbtnFlip setBackgroundImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"btn_allavailable" 
                           ofType:IMAGETYPE]] 
         forState:UIControlStateSelected]; 
    [m_objbtnFlip addTarget:self action:@selector(flipViews) forControlEvents:UIControlEventTouchUpInside]; 

    UIBarButtonItem *objBarButtonItemRight = [[UIBarButtonItem alloc] initWithCustomView:m_objbtnFlip]; 

    self.navigationItem.rightBarButtonItem=objBarButtonItemRight; 
    [objBarButtonItemRight release]; 
    objBarButtonItemRight = nil; 

Ve burada eylemi yazma,

-(void)flipViews { 
    // put action code here 
} 
İlgili konular