UIButton ที่สร้างโดย Interface Builder ขัดข้อง

ฉันได้จำกัดข้อผิดพลาดที่น่าเกลียดให้แคบลงแล้ว แต่เนื่องจากดูเหมือนว่ามีบางอย่างอยู่ภายใน nib/Interface Builder ฉันจึงไม่รู้ว่าจะต้องทำอย่างไรต่อไป

ฉันมี UIView ที่สร้างใน IB ซึ่งทำหน้าที่เป็นกล่องโต้ตอบที่กำหนดเอง มันแสดงข้อความและปุ่มสองปุ่ม (ดำเนินการต่อหรือยกเลิก) ปุ่มทั้งสองมีการตั้งค่าภาพพื้นหลังในตัวสร้างอินเทอร์เฟซ

มีบางอย่างผิดปกติกับวิธีการจัดการภาพพื้นหลังของปุ่มยกเลิก ด้วย NSZombieEnabled ฉันได้รันโปรแกรมแล้ว ส่วนใหญ่แล้ว วิธีการด้านล่างจะบันทึกสิ่งนี้:

-[ModalDialog showInView:title:message:cancelText:proceedText:]
dialogProceedButton <UIButton: 0x7031f10; frame = (286 192; 90 31) // (etc.)
dialogProceedButtonBackground <UIImage: 0x3b36120>
dialogCancelButton <UIButton: 0x3b39cd0; frame = (104 192; 90 31) // (etc.)
dialogCancelButtonBackground <UIImage: 0x3b3a920>

นั่นเป็นเรื่องปกติโดยสิ้นเชิง อย่างไรก็ตาม บางครั้งมันก็ทำเช่นนี้ (ฉันสามารถทำซ้ำได้อย่างน่าเชื่อถือหากฉัน "เร่ง" UI โดยการแตะปุ่มอินเทอร์เฟซบางปุ่มอย่างรวดเร็ว):

-[ModalDialog showInView:title:message:cancelText:proceedText:]
dialogProceedButton <UIButton: 0x7031f10; frame = (286 192; 90 31) // (etc.)
dialogProceedButtonBackground <UIImage: 0x3b36120>
dialogCancelButton <UIButton: 0x3b39cd0; frame = (104 192; 90 31) // (etc.)
*** -[UIImage retain]: message sent to deallocated instance 0x3b3a920

อย่างที่คุณเห็น NSZombieEnabled พบว่าภาพพื้นหลังสำหรับปุ่มยกเลิกได้รับการจัดสรรคืนแล้ว แต่กำลังส่งข้อความเก็บรักษา (ไม่ใช่โดยฉันเอง... รูปภาพนั้น เท่านั้น ใช้สำหรับปุ่มนี้ และ เท่านั้น เข้าถึงได้ในตัวสร้างอินเทอร์เฟซ ฉันไม่มี IBOutlets หรือตัวแปรใด ๆ เชื่อมโยงกับภาพนั้น)

แล้วตอนนี้ล่ะ?

แก้ไข:

บางครั้ง มันไม่ใช่ข้อความเก็บรักษาที่โดนจับได้ว่าเป็นซอมบี้ แต่บางครั้งก็เป็น isKindOfClass:

//(the object address is always dialogCancelButton.currentBackgroundImage)
-[UIImage isKindOfClass:]: message sent to deallocated instance 0x1661f0
//occasionally, these come along, too:
*** NSInvocation: warning: object 0x7e0d0b0 of class '_NSZombie_UIImage' does not implement methodSignatureForSelector: -- trouble ahead
*** NSInvocation: warning: object 0x7e0d0b0 of class '_NSZombie_UIImage' does not implement doesNotRecognizeSelector: -- abort

นี่คือวิธี "showInView" UIViews ที่กำหนดเองของฉัน:

- (void)showInView:superView 
             title:(NSString*)title 
             message:(NSString*)message 
             cancelText:(NSString*)cancelText 
             proceedText:(NSString*)proceedText {

NSLog(@"%s",__PRETTY_FUNCTION__);
NSLog(@"dialogProceedButton %@", dialogProceedButton);
NSLog(@"dialogProceedButtonBackground %@", dialogProceedButton.currentBackgroundImage);
NSLog(@"dialogCancelButton %@", dialogCancelButton);
NSLog(@"dialogCancelButtonBackground %@", dialogCancelButton.currentBackgroundImage);



CGRect rect;
dialogTitle.text = title;
dialogMessage.text = message;
[dialogProceedButton setTitle:proceedText forState:UIControlStateNormal];

if (cancelText == @"") { // SINGLE BUTTON DIALOG
  dialogCancelButton.hidden = YES;
  rect = [dialogProceedButton frame];
  rect.origin.x = 195; //center the button 
  [dialogProceedButton setFrame:rect];
} else {
  [dialogCancelButton setTitle:cancelText forState:UIControlStateNormal];
  dialogCancelButton.hidden = NO;
  rect = [dialogProceedButton frame];
  rect.origin.x = 286; //button on right of dialog box 
  [dialogProceedButton setFrame:rect];
}

[UIView beginAnimations:@"modalAppears" context:nil];
[UIView setAnimationDuration:0.5];
[superView addSubview:self];
self.alpha = 1.0;
[UIView commitAnimations];
}

ขอบคุณ!


person Rob    schedule 15.10.2009    source แหล่งที่มา


คำตอบ (2)


โอเค อันนี้เป็นอะไรมาก ฉันตัดสินใจลองกลับภาพสำหรับปุ่มดำเนินการต่อและยกเลิก ผลลัพธ์ก็คือรูปภาพปุ่ม ดำเนินการต่อ อาจทำให้เกิดการขัดข้อง (เป็นครั้งคราว) ฉันลบอิมเมจออกจากโปรเจ็กต์ของฉันและจากตัวสร้างอินเทอร์เฟซโดยสมบูรณ์ จากนั้นฉันก็เพิ่มสำเนาใหม่พร้อมชื่อใหม่แล้วเชื่อมต่อเข้าด้วยกัน

ด้วยการตั้งค่าก่อนหน้านี้ ฉันสามารถสร้างข้อขัดข้องได้ประมาณ 40% ของเวลาทั้งหมด ฉันได้ลองประมาณ 20 ครั้งเพื่อสร้างข้อขัดข้องหลังจากการเปลี่ยนแปลงเหล่านี้ และตอนนี้ฉันไม่สามารถสร้างข้อขัดข้องได้เลย

หากภาพหรือปลายปากกาเสียหาย ทำไม ทำไม เหตุใดจึงทำให้เกิดอาการสุ่ม/ไม่สม่ำเสมอ?

อะไรนะ. หวังว่ามันจะดีและได้รับการแก้ไขอย่างแท้จริง


อัปเดต:

และ... ยังมีอะไรเพิ่มเติมอีกเล็กน้อย ปรากฎว่าฉันค้นพบว่าฉันมีบังเอิญใช้รูปภาพเดียวกันกับตัวยึดตำแหน่งในมุมมองคำแนะนำ (ไม่สมบูรณ์) เพื่อความสะดวกชั่วคราว ฉันใช้ [UIImage imageNamed:] เพื่อจับภาพ ได้รับการจัดสรรและเผยแพร่อย่างเหมาะสม แต่ดูเหมือนว่าความร่วมมือของ IB กับเมธอด imageNamed: และ/หรือแคชจะไม่สมบูรณ์

ความจริงที่ว่าเมื่อฉันไปหยิบสำเนารูปภาพใหม่มา ฉันยังได้ตั้งชื่อ ชื่อ ใหม่ให้กับมันด้วย ซึ่งหมายความว่าตอนนี้รูปภาพของปุ่ม IB และรูปภาพตัวยึดตำแหน่งชั่วคราวจะไม่เป็นรูปภาพเดียวกันอีกต่อไป .

ฉันกลับไปสำรองข้อมูลโปรเจ็กต์ของฉันเมื่อสองสามวันก่อนเพื่อทดสอบทฤษฎีของฉัน สิ่งที่ฉันทำคือบอกมุมมองคำแนะนำให้ใช้รูปภาพตัวยึดตำแหน่งอื่น หยุดข้อขัดข้องแล้ว

นี่อาจเป็นข้อบกพร่องของ SDK ไม่มีเหตุผลใดๆ ที่จะไม่ใช้รูปภาพใน IB และใช้รูปภาพเดียวกันในที่อื่นโดยใช้ imageNamed: ถ้าฉันรู้สึกเจ้าเล่ห์หรือเบื่อสักวันหนึ่ง บางทีฉันอาจจะกลั่นกรองสิ่งนี้ออกเป็นโปรเจ็กต์ตัวอย่างเพื่อส่งไปยัง Apple Radar

person Rob    schedule 16.10.2009
comment
สิ่งนี้ดูสุดยอดและไม่น่าเป็นไปได้สำหรับฉัน ฉันคิดว่าผู้คนจำนวนมากใช้ชื่อที่มีภาพและ IB ตลอดเวลา มันจะน่าสนใจที่จะทดสอบ - person Kendall Helmstetter Gelner; 17.10.2009

ไฟล์ XIB ของคุณเชื่อมต่อกับมุมมองของคุณอย่างไร IBOutlets ใดที่คุณกำหนดไว้? ฉันสงสัยจริงๆ ว่าคุณได้แก้ไขปัญหาของคุณในแบบที่คุณอธิบายแล้ว

person Kendall Helmstetter Gelner    schedule 16.10.2009
comment
ฉันยอมรับว่าดูเหมือนว่าไม่น่าจะเป็นสาเหตุ (หรือการแก้ไข) ของปัญหา แต่ก็ไม่ได้ล้มเหลวแม้แต่ครั้งเดียวตั้งแต่ฉันทำสิ่งหนึ่งนั้น ฉันอาจจะลงเอยด้วยการพยายามประมาณ 50 ครั้งเพื่อสร้างการชนอีกครั้งก่อนที่ฉันจะมั่นใจมากพอที่จะเดินหน้าต่อไป ก่อนการเปลี่ยนแปลง ฉันสามารถทำให้ระบบขัดข้องเกิดขึ้นทุกๆ 2 ถึง 4 ครั้งที่ฉันพยายาม ยัก - person Rob; 16.10.2009
comment
(แน่นอนว่ายังมีอะไรมากกว่านี้ ... ดูการอัปเดตในคำตอบทั้งหมดของฉัน) - person Rob; 17.10.2009