เป็นไปได้ไหมที่จะอัปเดตหัวเรื่อง / ข้อความ UIButton โดยใช้โปรแกรม


96

ฉันมีUIButtonที่เมื่อกดแล้วจะแสดงมุมมองใหม่ที่ผู้ใช้สามารถเปลี่ยนการตั้งค่าบางอย่างได้ เมื่อมุมมองถูกปิดฉันต้องการอัปเดตชื่อ / ข้อความของUIButtonเพื่อแสดงสถานะใหม่ ฉันกำลังโทร:

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];
[myButton setTitle: @"myTitle" forState: UIControlStateApplication];
[myButton setTitle: @"myTitle" forState: UIControlStateHighlighted];
[myButton setTitle: @"myTitle" forState: UIControlStateReserved];
[myButton setTitle: @"myTitle" forState: UIControlStateSelected];
[myButton setTitle: @"myTitle" forState: UIControlStateDisabled];

แต่ดูเหมือนว่าจะไม่เปลี่ยนแปลงไปจากข้อความ / ชื่อเรื่องเดิมตามที่ระบุไว้ใน IB


2
แน่ใจหรือว่ารหัสที่โพสต์ถูกเรียก? คุณได้วาง BREAKPOINT เพื่อพิสูจน์ว่า? คุณสามารถโพสต์ลายเซ็นของผู้รับมอบสิทธิ์ได้หรือไม่?
Pablo Santa Cruz

3
นอกจากนี้ฉันเชื่อว่าคุณสามารถอ้างอิงสถานะการควบคุมหลายสถานะพร้อมกัน: [myButton setTitle: @ "myTitle" forState :( UIControlStateNormal | UIControlStateApplication | UIControlStateHighlighted | ... )]; สังเกตการใช้ตัวดำเนินการ bitwise OR ซึ่งตรงข้ามกับตัวดำเนินการตรรกะ OR (||) โดยทั่วไปเมื่อคุณจัดการกับรัฐเช่นนี้คุณสามารถหรือร่วมกับ | ตัวดำเนินการ มีคนแก้ไขฉันถ้าฉันเข้าใจผิดอย่างร้ายแรง :)
CIFilter

ฉันหวังว่าพวกเขาจะมีเหมือน UIControlStateAll: D
taber

2
ชุดค่าผสมระดับบิตดูเหมือนจะใช้ไม่ได้กับฉันใน iOS5
Echilon

ปัญหาเดียวกันที่นี่ ชุดค่าผสม Bitwise ใช้ไม่ได้สำหรับฉันบน iOS5 / CC @LucasTizma
znq

คำตอบ:


52

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


แก้ไข: แม้ว่าจะไม่ใช่ในกรณีนี้ แต่สิ่งนี้ก็สามารถเกิดขึ้นได้เช่นกันหากคุณตั้งชื่อที่เป็นที่มาของปุ่มจากนั้นคุณพยายามเปลี่ยนชื่อไม่ใช่ชื่อที่มาจากแหล่งที่มา


4
บิงโกนั่นล่ะขอบคุณ ฉันหวังว่า Objective-C จะโยน NullPointerException ในกรณีเช่นนี้แทนที่จะแสร้งทำเป็นเงียบ ๆ ว่าสามารถส่งข้อความไปยังวัตถุศูนย์ได้ นี่มันกัดฉันแทบทุกวัน ... ฮึ!
George Armhold

20
ObjC ไม่ 'หลอก' ตกลงที่จะส่งข้อความไปยังศูนย์เพราะมันเป็น OK เพื่อส่งข้อความไปยังศูนย์ ...
Jasarien

1
ปัญหาที่นี่ไม่ใช่ตัวชี้ศูนย์ ปัญหาคือ IB ได้ตั้งค่าอินสแตนซ์ UIButton ที่ไม่ได้รับการอ้างอิงอย่างถูกต้องในโค้ด (ผ่าน IBOutlet) ดังนั้นจึงไม่สามารถจัดการโดยใช้โปรแกรมได้
CIFilter

113

ฉันแก้ไขปัญหาเพียงแค่ตั้งค่าพารามิเตอร์ title สำหรับ UIControlStateNormal และมันจะทำงานในสถานะอื่นโดยอัตโนมัติ ปัญหาน่าจะเกิดขึ้นเมื่อคุณตั้งค่า UIControlState อื่น

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];


13

ฉันค้นพบปัญหาอื่น อาจเป็นข้อบกพร่องที่เกิดขึ้นใน iOS 5 แต่ฉันคิดว่าฉันจะชี้ให้คนอื่นที่พบเจอ

หากคุณไม่ได้ตั้งค่าข้อความเริ่มต้นสำหรับปุ่มใน XIB ข้อความจะไม่ปรากฏขึ้นหากคุณตั้งค่าโดยใช้โปรแกรม และถ้าคุณตั้งค่าข้อความใน XIB ข้อความใด ๆ ที่คุณกำหนดให้กับปุ่มในภายหลังโดยทางโปรแกรมจะถูกตัดให้เหลือขนาดของข้อความเริ่มต้น

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


1
ฉันสังเกตเห็นพฤติกรรมทั้งสามอย่างนี้แล้วและมันน่ารำคาญอย่างแน่นอน
หมัด

2
ฉันมีปัญหาในการตัดทอน (การเปลี่ยนข้อความให้ยาวขึ้นโดยใช้โปรแกรม) ดังนั้นฉันจึงใส่ช่องว่างเพิ่มเติมที่ส่วนท้ายของข้อความเพื่อ "จอง" ช่องว่างนั้นเมื่อฉันเปลี่ยนข้อความเป็นคำที่ยาวขึ้น ที่ได้ผลสำหรับฉัน
mattorb

2
ดูเหมือนว่าการแก้ไขนี้คือการใช้เมธอด [_button setTitle: @ "title" forState: UIControlStateNormal]; แทนที่จะเข้าถึงคุณสมบัติ _button.titleLabel.text โดยตรง ติดกับวิธีการโทรและคุณอาจจะได้รับสิ่งที่คุณต้องการ
Rymnel

12

แม้ว่าปัญหาของ Caffeine Coma จะได้รับการแก้ไขแล้ว แต่ฉันก็อยากจะเสนออีกสาเหตุหนึ่งที่ทำให้ชื่อไม่ปรากฏบน UIButton

หากคุณตั้งค่ารูปภาพสำหรับ UIButton โดยใช้ไฟล์

- (void)setImage:(UIImage *)image forState:(UIControlState)state

มันครอบคลุมหัวเรื่องได้ ฉันพบว่านี่เป็นวิธีที่ยากและลองนึกภาพคุณบางคนจบลงด้วยการอ่านหน้านี้ด้วยเหตุผลเดียวกัน

ใช้วิธีนี้แทน

- (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state

สำหรับภาพปุ่มและชื่อเรื่องจะไม่ได้รับผลกระทบ

ฉันทดสอบสิ่งนี้ด้วยปุ่มที่สร้างโดยโปรแกรมและปุ่มที่สร้างใน. xib



4

ปรากฎว่าเอกสารบอกคำตอบ! UIButton จะละเว้นการเปลี่ยนหัวเรื่องหากมี Attributed String ที่จะใช้อยู่แล้ว (ดูเหมือนจะเป็นค่าเริ่มต้นที่คุณได้รับเมื่อใช้ตัวสร้างส่วนต่อประสาน Xcode)

ฉันใช้สิ่งต่อไปนี้:

[self.loginButton 
     setAttributedTitle:[[NSAttributedString alloc] initWithString:@"Error !!!" attributes:nil] 
     forState:UIControlStateDisabled];
[self.loginButton setEnabled:NO];

3

อีกสาเหตุหนึ่งที่เป็นไปได้คือ:

หากคุณพยายามตั้งชื่อปุ่มในไฟล์ (id)initWithNibName: ...เมธอดคุณสมบัติของปุ่มคุณจะยังคงเป็นศูนย์ ยังไม่ได้กำหนดให้กับ UIButton

คุณจะต้องแน่ใจว่าคุณกำลังตั้งปุ่มของคุณในวิธีการเหมือน(void)viewWillLoadหรือแต่คุณอาจไม่ต้องการที่จะตั้งค่าให้เป็นปลาย(void)viewWillAppear(void)viewDidAppear


2

บางครั้งมันอาจซับซ้อนจริงๆ วิธีง่ายๆคือ " รีเฟรช " มุมมองปุ่ม!

//Do stuff to your button here.  For example:

[mybutton setEnabled:YES];

//Refresh it to new state.

[mybutton setNeedsDisplay];

1

ฉันยังคงมีปัญหากับสิ่งนี้วิธีแก้ปัญหาเดียวคือเพิ่มรูปภาพและป้ายกำกับเป็นมุมมองย่อยใน uibutton จากนั้นฉันก็พบว่าปัญหาหลักคือฉันใช้ UIButton ที่มีชื่อเรื่อง: Attributed เมื่อฉันเปลี่ยนเป็น Plain การตั้งค่า titleLabel.text ก็เป็นเคล็ดลับ!


1

@funroll ใช่อย่างแน่นอน คุณสามารถดูสิ่งที่คุณต้องการได้ที่นี่ตรวจสอบให้แน่ใจฟังก์ชั่นวิ่งบนหัวข้อหลักเท่านั้น หากคุณไม่ต้องการจัดการกับเธรดคุณสามารถทำได้เช่นนี้: สร้าง NSUserDefaults และในเงื่อนไขการ Cheking ViewDidLoad ถูกกดปุ่มในมุมมองอื่นหรือไม่ (ในชุดมุมมองอื่นในข้อมูลที่จำเป็นสำหรับ NSUserDefaults) และขึ้นอยู่กับเงื่อนไขที่กำหนดชื่อที่ต้องการสำหรับ UIButton ของคุณดังนั้น [yourButton setTitle: @ "Title" forState: UIControlStateNormal];


สิ่งนี้มีประโยชน์มากสำหรับฉัน .. ปรากฎว่าหากคุณเรียก setTitle และ setNeedsDisplay จากเธรดพื้นหลัง View จะได้รับการอัปเดตในภายหลัง
user1111828

0

ตรวจสอบให้แน่ใจว่าคุณอยู่ในเธรดหลัก

มิฉะนั้นจะยังคงบันทึกข้อความปุ่ม จะอยู่ที่นั่นเมื่อคุณตรวจสอบวัตถุในดีบักเกอร์ แต่จะไม่อัปเดตมุมมองจริงๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.