ข้อผิดพลาด“ ตัวเลือกที่ไม่รู้จักส่งไปยังอินสแตนซ์” ใน Objective-C


155

ฉันสร้างปุ่มและเพิ่มการกระทำให้ แต่ทันทีที่มีการเรียกใช้ฉันได้รับข้อผิดพลาดนี้:

-[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance
 0x3d03ac0 2010-03-16 22:23:58.811
 Money[8056:207] *** Terminating app
 due to uncaught exception
 'NSInvalidArgumentException', reason:'*** -[NSCFDictionary numberButtonClick:]:  unrecognized selector sent to instance 0x3d03ac0'

นี่คือรหัสของฉัน:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        UIButton *numberButton = [UIButton buttonWithType:UIButtonTypeCustom];        
        numberButton.frame = CGRectMake(10, 435, 46, 38);
        [numberButton setImage:[UIImage imageNamed:@"one.png"] forState:UIControlStateNormal];
        [numberButton addTarget:self action:@selector(numberButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview: numberButton]; 
    }
return self;
}

-(IBAction)numberButtonClick:(id)sender{
    NSLog(@"---");
}

คำตอบ:


187

ดูเหมือนว่าคุณไม่ใช่หน่วยความจำที่จัดการตัวควบคุมมุมมองอย่างถูกต้องและกำลังถูกจัดสรรคืนในบางจุด - ซึ่งทำให้numberButtonClicked:วิธีการส่งไปยังวัตถุอื่นที่ตอนนี้ครอบครองหน่วยความจำที่ตัวควบคุมมุมมองครอบครองอยู่ก่อนหน้านี้ ...

ตรวจสอบให้แน่ใจว่าคุณได้รักษา / ปล่อยตัวควบคุมมุมมองของคุณอย่างถูกต้อง


105
นั่นเป็นการวินิจฉัยที่ชาญฉลาดมากจากโค้ดไม่กี่บรรทัด
Michael Morrison

41
ตกลงดังนั้นระบุปัญหา ... แต่ "ตรวจสอบให้แน่ใจว่าคุณได้เก็บ / เปิดตัวควบคุมมุมมองของคุณอย่างถูกต้อง" เป็นคำแนะนำไม่ใช่วิธีแก้ปัญหา
Alex Gray

12
@alex สีเทาอะไร การจัดการหน่วยความจำที่เหมาะสมในตัวควบคุมมุมมองแก้ปัญหา ... ฉันไม่เข้าใจวิธีการที่ไม่ได้แก้ปัญหา?
Jasarien

28
แก้ไข. แม้ว่าสิ่งนี้ดูเหมือนจะเป็น "การแก้ไข" .. และฉันอาจอยู่ในกลุ่มน้อย (แต่ฉันยังคงมีอยู่) แต่การเชื่อมต่อระหว่างปัญหาและวิธีแก้ไขไม่ชัดเจนทันที ตัวอย่างเช่นฉันพบ-[NSWindow end]: unrecognized selector sent to instance 0x100523e80 และแม้ว่าฉันตระหนักถึงความคล้ายคลึงกันกับ OP และอาจเป็นสาเหตุของปัญหาจากคำตอบของคุณการดำเนินการแก้ไขไม่ชัดเจนทันที
Alex Gray

12
มันชัดเจนทันที การจัดการหน่วยความจำ NSWindow ของคุณไม่ถูกต้องตรงจุด ผ่านวงจรชีวิตและแก้ไขให้ถูกต้อง
Jasarien

127

สำหรับผู้ที่มาที่นี่ผ่านทาง Google อย่างที่ฉันทำซึ่งอาจเกี่ยวข้องกับ Xcode 4.2 + / iOS 5+ ขึ้นไป ARC ฉันมีข้อผิดพลาดเดียวกัน " ตัวเลือกที่ไม่รู้จักถูกส่งไปยังอินสแตนซ์ " ในกรณีของฉันฉันมีการตั้งเป้าหมายของ UIButton ที่ตั้งค่าให้ส่งผ่านตัวเองเป็นพารามิเตอร์ผู้ส่ง แต่ภายหลังรู้ว่าฉันไม่ต้องการ ดังนั้นสิ่งที่ชอบ:

- (IBAction)buttonPressed:(UIButton *)sender {

เปลี่ยนเป็น:

- (IBAction)buttonPressed {

คลิกขวาที่คำถาม UIButton แสดงให้เห็นว่าเหตุการณ์ Touch Up Inside เชื่อมโยงกับปุ่มควบคุมมุมมองที่กด: วิธีการ การลบสิ่งนี้และการกำหนดใหม่ให้กับวิธีการที่ได้รับการแก้ไขนั้นเป็นวิธีการรักษา


สิ่งนี้มีประโยชน์มาก แต่ฉันคิดว่าคำถามและคำตอบของตัวเองจะช่วยให้ค้นหาได้ง่ายขึ้น
Curtis Inderwiesche

@LeonardChallis คุณจะสามารถอ้างอิงผู้ส่งในปุ่มกดได้อย่างไรหากไม่ผ่านพารามิเตอร์
zakdances

8
คำตอบที่เป็นประโยชน์มาก ฉันเพิ่งพบปัญหาที่แน่นอนและวิธีการแก้ปัญหาของคุณถูกต้อง ติดตามคลาส Stanford iOS บน iTunesU เมื่อเกิดเหตุการณ์นี้ขึ้น ขอบคุณอีกครั้งสำหรับคำตอบของคุณ!
Marshall Alsup

1
@ LeonardChallis ขอบคุณ ฉันเพิ่มคำตอบฟรีให้กับคำตอบของคุณ
1.21 gigawatts

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

74

นี่คือคำตอบของ Google ที่ดีที่สุดสำหรับปัญหานี้ แต่ฉันมีสาเหตุ / ผลลัพธ์ที่แตกต่างกัน - ฉันคิดว่าฉันจะเพิ่มในสองเซ็นต์ของฉันในกรณีที่คนอื่นสะดุดในปัญหานี้

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

ดังนั้นตรวจสอบให้แน่ใจว่าการกระทำของคุณต่อสายถูกต้อง


นี่เป็นปัญหาของฉัน ฉันเปลี่ยนชื่อฟังก์ชั่นและเปลี่ยนรหัสของฉัน แต่ไม่ได้เปลี่ยนการเชื่อมต่อในไฟล์ xib
BFTrick

2
ขอบคุณ! ปรากฎว่าฉันมีสามวิธีที่ฉันได้ลบยังคงอ้างอิง รบกวนฉันหนึ่งสัปดาห์!
erdekhayser

25

ตกลงฉันต้องชิปที่นี่ สหกรณ์แบบไดนามิกสร้างปุ่ม ฉันมีปัญหาที่คล้ายกันและคำตอบ (หลังจากการล่าสัตว์หลายชั่วโมง) นั้นง่ายมากมันทำให้ฉันป่วย

เมื่อใช้:

action:@selector(xxxButtonClick:)

or (as in my case)

action:NSSelectorFromString([[NSString alloc] initWithFormat:@"%@BtnTui:", name.lowercaseString])

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

ตัวเลือกรหัสผู้รับมีลักษณะดังนี้:

- (void)doneBtnTui:(id)sender {
  NSLog(@"Done Button - with sender");
}
 or
- (void)doneBtnTui {
  NSLog(@"Done Button - no sender");
}

ตามปกติมันเป็นคำตอบที่ชัดเจนเสมอที่จะพลาด


1
ขอบคุณมาก! นี่เป็นปัญหาของฉัน (ไม่ใส่เครื่องหมาย ':' ที่ท้ายชื่อตัวเลือก) ทำไมเป็นเรื่องง่าย ๆ ที่โง่ที่สุดที่ทำให้เราตบหัวกับกำแพงตอนตี 3 ในตอนเช้า? ขอบคุณจริงๆ!
Twright

23

ในกรณีของฉันฟังก์ชั่นไม่ได้คาดหวังข้อโต้แย้ง แต่ปุ่มถูกกำหนดค่าให้ส่งหนึ่งทำให้เกิดข้อผิดพลาด ในการแก้ไขปัญหานี้ฉันต้องติดตั้งตัวจัดการเหตุการณ์อีกครั้ง

นี่คือหน้าที่ของฉัน:

ป้อนคำอธิบายรูปภาพที่นี่

สังเกตว่ามันไม่มีข้อโต้แย้ง

นี่คือภาพของการกำหนดค่าปุ่มของฉัน (คลิกขวาที่ปุ่มเพื่อดู):

ป้อนคำอธิบายรูปภาพที่นี่

สังเกตเห็นว่ามี 3 ตัวจัดการเหตุการณ์

ในการแก้ไขปัญหานี้ฉันต้องลบรายการเหตุการณ์แต่ละรายการเนื่องจากหนึ่งในนั้นกำลังส่งการอ้างอิงถึงตัวเองไปยังฟังก์ชัน enterPressed ในการลบรายการเหล่านี้ฉันคลิกที่ไอคอน x เล็ก ๆ ถัดจากชื่อของแต่ละรายการจนกว่าจะไม่มีรายการใดปรากฏขึ้น

ป้อนคำอธิบายรูปภาพที่นี่

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

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้คุณควรมีตัวจัดการเหตุการณ์เดี่ยวที่เชื่อมต่อกับเหตุการณ์ปุ่มที่ไม่มีการขัดแย้ง:

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบนี้ตรงกับคำตอบของ @Leonard Challis ซึ่งคุณควรอ่านเช่นกัน


14

สิ่งนี้สามารถเกิดขึ้นได้หากคุณไม่ได้ตั้งค่า "คลาส" ของมุมมองในตัวสร้างส่วนต่อประสาน


ขอบคุณมาก! นี่เป็นสาเหตุให้แอปของฉันขัดข้องในส่วนย่อยเพียงแค่ลืมตั้งคลาสของตัวควบคุม
Eichhörnchen

ทำไมมันจำเป็นต้องรู้ชั้น? ฉันกำลังพยายามใช้ UITableViewSection เป็น UIView และฉันได้รับข้อผิดพลาดนี้ คอมไพเลอร์บอกว่า UITableViewSection ไม่มีอยู่ดังนั้นฉันจึงสันนิษฐานว่าภายใน UIKit
Ian Warburton

13

ในกรณีของฉันฉันใช้ NSNotificationCenter และพยายามใช้ตัวเลือกที่ไม่มีอาร์กิวเมนต์ แต่เพิ่มโคลอน การลบเครื่องหมายโคลอนจะแก้ไขปัญหา

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

ดูคำตอบของ Adam Rosenfield ที่นี่: Selectors in Objective-C?


11

ฉันมีปัญหากับโครงการ Swift ที่ฉันสร้างปุ่มแบบไดนามิก รหัสปัญหา:

var trashBarButtonItem: UIBarButtonItem {
    return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked")
}

func newButtonClicked(barButtonItem: UIBarButtonItem) {
    NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
}

ทางออกคือการเพิ่มเครื่องหมายจุดคู่เต็ม ':' หลังการกระทำ: เช่น

var trashBarButtonItem: UIBarButtonItem {
        return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked:")
    }

    func newButtonClicked(barButtonItem: UIBarButtonItem) {
        NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
    }

ตัวอย่างแบบเต็มที่นี่: https://developer.apple.com/library/content/samplecode/UICatalog/Listings/Swift_UIKitCatalog_DefaultToolbarViewController_swift.html


หลังจากทำตามบทแนะนำและอ่านคำแนะนำเกี่ยวกับปัญหาเดียวกันนี้แล้ว - ฉันล้มเหลว: D
user2161301

6

สาเหตุที่ชัดเจนที่สุดของสิ่งนี้ (รวมไว้เพื่อความสมบูรณ์) คือการชี้ตัวชี้อย่างไม่ถูกต้องและเรียกวิธีการของคลาสที่ไม่ถูกต้อง

NSArray* array = [[NSArray alloc] init];
[(NSDictionary*)array objectForKey: key]; // array is not a dictionary, hence exception

นี่เป็นคำใบ้ที่ดี - ไม่ใช่การ subclassing มุมมองหรือวัตถุข้อมูล (เช่นโดยการล้มเหลวในการเพิ่มชื่อ subclass) เป็นอีกวิธีหนึ่งที่จะเกิดขึ้น
Brad M

4

ฉันยังมีปัญหาเดียวกัน

ฉันลบ uibutton ในสตอรี่บอร์ดของฉันและสร้างใหม่ .. ตอนนี้ทุกอย่างทำงานได้ดี


3

ฉันมีปัญหาที่คล้ายกัน แต่สำหรับฉันทางออกแตกต่างกันเล็กน้อย ในกรณีของฉันฉันใช้หมวดหมู่เพื่อขยายชั้นเรียนที่มีอยู่ (UIImage สำหรับความสามารถในการปรับขนาดบาง - เห็นนี้HOWTOในกรณีที่คุณสนใจ) และลืมที่จะเพิ่มแฟ้ม .m * เพื่อสร้างเป้าหมาย ข้อผิดพลาดโง่ แต่ไม่ชัดเจนเสมอเมื่อมันเกิดขึ้นที่จะมอง ฉันคิดว่ามันคุ้มค่าที่จะแบ่งปัน ...


3

สิ่งนี้เกิดขึ้นกับฉันเพราะตั้งใจลบ "@IBAction func ... " ในโค้ดคลาส UIViewcontroller ของฉันดังนั้นใน Storyboard จึงสร้าง Reference Outlet แต่ที่รันไทม์มีฟังก์ชั่นการประมวลผลใด ๆ

วิธีแก้ไขคือลบการอ้างอิง Outlet ภายในตัวตรวจสอบคุณสมบัติแล้วสร้างใหม่อีกครั้งโดยลากด้วยคีย์คำสั่งไปยังรหัสคลาส

หวังว่ามันจะช่วย!


ในทำนองเดียวกันสิ่งนี้ก็เกิดขึ้นกับฉันเมื่อปุ่มอ้างอิงฟังก์ชั่นที่ไม่มีอยู่อีกต่อไป
Josh Wolff

2

ฉันคิดว่าคุณควรใช้โมฆะแทน IBAction ในรูปแบบย้อนกลับ เพราะคุณกำหนดปุ่มโดยทางโปรแกรม


2

อีกวิธีที่เป็นไปได้: เพิ่ม '-ObjC' ลงในอาร์กิวเมนต์ตัวลิงก์ของคุณ

คำอธิบายแบบเต็มอยู่ที่นี่: หมวดหมู่ Objective-C ในไลบรารีคงที่

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


2

ฉันมีข้อผิดพลาดเดียวกันและฉันค้นพบสิ่งต่อไปนี้:

เมื่อคุณใช้รหัส

[self.refreshControl addTarget:self action:@selector(yourRefreshMethod:) forControlEvents:UIControlEventValueChanged];

คุณอาจคิดว่ามันกำลังมองหาตัวเลือก:

- (void)yourRefreshMethod{
    (your code here)
}

แต่จริงๆแล้วมันกำลังมองหาตัวเลือก:

- (void)yourRefreshMethod:(id)sender{
    (your code here)
}

ตัวเลือกนั้นไม่มีอยู่ดังนั้นคุณจะได้รับความผิดพลาด

คุณสามารถเปลี่ยนตัวเลือกเพื่อรับ (id) ผู้ส่งเพื่อแก้ไขข้อผิดพลาด

แต่ถ้าคุณมีฟังก์ชั่นอื่น ๆ ที่เรียกฟังก์ชั่นรีเฟรชโดยไม่ต้องให้ผู้ส่งล่ะ คุณต้องการฟังก์ชั่นเดียวที่เหมาะกับทั้งคู่ ทางออกที่ง่ายคือการเพิ่มฟังก์ชั่นอื่น:

- (void)yourRefreshMethodWithSender:(id)sender{
    [self yourRefreshMethod];
}

จากนั้นปรับเปลี่ยนรหัสแบบเลื่อนลงเพื่อเรียกตัวเลือกนั้น:

[self.refreshControl addTarget:self action:@selector(yourRefreshMethodWithSender:) forControlEvents:UIControlEventValueChanged];

ฉันกำลังทำหลักสูตร Stanford iOS บน Mac รุ่นเก่าที่ไม่สามารถอัปเกรดเป็น Mac OSX เวอร์ชันล่าสุดได้ ดังนั้นฉันยังคงสร้างสำหรับ iOS 6.1 และสิ่งนี้แก้ไขปัญหาให้ฉันได้


2

ในกรณีของฉันฉันแก้ไขปัญหาหลังจาก 2 ชั่วโมง:

ผู้ส่ง (รายการ tabBar) ไม่มีช่องอ้างอิงใด ๆOutlet ดังนั้นมันจึงชี้ไปที่ใด

Juste สร้างเต้าเสียบอ้างอิงที่สอดคล้องกับฟังก์ชั่นของคุณ

หวังว่านี่จะช่วยพวกคุณได้


เพื่อเพิ่มในกรณีของฉันฉันลืมที่จะย้ายพอร์ตIBActionไปยังสวิฟท์ ดังนั้นมันจึงบ่นว่ามันต้องการเรียกฟังก์ชั่นนั้น แต่ไม่พบ
DevNebulae

1

ฉันกำลังเรียนรู้การพัฒนา iOS และทำหนังสือ "Beginning iOS6 Development" โดย aPress ฉันได้รับข้อผิดพลาดเดียวกันในบทที่ 10: กระดานเรื่องราว

ฉันใช้เวลาสองวันในการคิด แต่พบว่าฉันตั้งใจตั้งแท็กของเซลล์ TableView เป็น 1 เมื่อฉันไม่ควรมี สำหรับคนอื่นที่ทำหนังสือเล่มนี้และได้รับข้อผิดพลาดที่คล้ายกันฉันหวังว่านี่จะช่วยได้

ฉันหวังว่าข้อผิดพลาดในอนาคตในรหัสของฉันจะหาได้ง่ายขึ้น! ฮ่าฮ่าฮ่า ข้อผิดพลาดในการดีบักไม่ได้ทำอะไรเลยที่จะผลักดันฉันไปในทิศทางที่ถูกต้องเพื่อหาคำตอบ (หรืออย่างน้อยฉันก็ใหม่เกินไปที่จะเข้าใจตัวแก้จุดบกพร่อง, ฮ่า ๆ )


1

ในกรณีของฉันฉันใช้ UIWebView และฉันผ่าน NSString ในพารามิเตอร์ที่สองแทน NSURL ดังนั้นฉันสงสัยว่าประเภทคลาสที่ไม่ถูกต้องที่ส่งไปยังฟังก์ชันอาจทำให้เกิดข้อผิดพลาดนี้ได้


1

.. และตอนนี้ฉัน

ฉันมีปุ่มที่เชื่อมโยงกับวิธีการที่เข้าถึงพารามิเตอร์ของปุ่มอื่นและใช้งานได้ดี แต่ทันทีที่ฉันพยายามทำบางสิ่งด้วยปุ่มตัวเองฉันได้รับความเสียหาย ขณะคอมไพล์ไม่มีข้อผิดพลาดปรากฏขึ้น ..

ฉันไม่สามารถลิงก์ปุ่มกับเจ้าของไฟล์ได้ ดังนั้นถ้าใครที่นี่โง่เหมือนฉันลองนี่ :)


1

อีกวิธีแก้ปัญหา / กรณีแตกต่างกันเล็กน้อย

ฉันกำลังใช้ Xamarin และ MvvmCross และฉันพยายามผูก UIButton กับ ViewModel ฉันมี UIButton ต่อสายเข้ากับ Outlet และ TouchUpInside

เมื่อมีผลผูกพันฉันใช้ Outlet เท่านั้น:

set.Bind (somethingOutlet).For ("TouchUpInside").To(vm => vm.Something);

สิ่งที่ฉันต้องทำคือลบการเชื่อมต่อการกระทำ (TouchUpInside) ใน XCode และนั่นแก้ไขได้

ป.ล. ฉันเดาว่านี่เป็นพื้นฐานที่เกี่ยวข้องกับคำตอบก่อนหน้าและโดยเฉพาะ @Chris Kaminski แต่ฉันหวังว่านี่จะช่วยคน ...

ไชโย


1

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


1

สำหรับฉันมันคือการเชื่อมต่อที่เหลือสร้างขึ้นใน interfacebuilder bij ctrl-dragging ชื่อของการเชื่อมต่อที่ใช้งานไม่ได้อยู่ในบันทึกข้อผิดพลาด

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[NameOfYourApp.NameOfYourClass nameOfCorruptConnection:]:
unrecognized selector sent to instance 0x7f97a48bb000'

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


0

ฉันกำลังตอบกลับ Leonard Challis เนื่องจากฉันยังเรียนวิชา Stanford iOS C193P เช่นเดียวกับผู้ใช้ "oli206"

"การยกเลิกแอปเนื่องจากข้อยกเว้น 'NSInvalidArgumentException ที่ไม่ได้ตรวจสอบ' เหตุผล:"

ปัญหาคือฉันมีปุ่ม "Enter" บนเครื่องคิดเลขที่เชื่อมต่อสองครั้งและเพื่อนคนหนึ่งชี้ให้เห็นว่าการตรวจสอบปุ่มใน Storyboard พบว่ามี 2 รายการที่อยู่ในคุณลักษณะ "Touch Up Inside" เมื่อฉันคลิกขวา ปุ่ม "Enter" การลบหนึ่งในสอง "Touch Up Inside" "Sent Sent" ช่วยแก้ปัญหาได้

สิ่งนี้แสดงให้เห็นว่าปัญหาถูกกระตุ้น (สำหรับคลาสวิดีโอ C193P บนเครื่องคิดเลข Walkthrough ในการมอบหมาย 1) เมื่อมีการส่งเหตุการณ์ 2 เหตุการณ์เหตุการณ์หนึ่งเกิดจากข้อยกเว้น


ฉันมี 3 รายการบางวิธี :)
1.21 gigawatts

0

มันสามารถเกิดขึ้นได้เมื่อคุณไม่ได้กำหนด ViewController ให้กับ ViewControllerScene ใน InterfaceBuilder ดังนั้น ViewController.m จึงไม่เชื่อมต่อกับฉากใด ๆ


0

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


0

อีกสาเหตุที่โง่เขลาอย่างนี้คือการมีตัวเลือกที่กำหนดไว้ในส่วนต่อประสาน (.h) แต่ไม่ได้อยู่ในการนำไปใช้ (.m) (pe typo)


0

อีกเหตุผล / วิธีแก้ไขเพื่อเพิ่มลงในรายการ อันนี้เกิดจาก iOS6.0 (และ / หรือการเขียนโปรแกรมไม่ดี) ในรุ่นเก่า ๆ ตัวเลือกจะจับคู่หากประเภทพารามิเตอร์ตรงกัน แต่ใน iOS 6.0 ฉันเกิดปัญหาในรหัสการทำงานก่อนหน้าซึ่งชื่อของพารามิเตอร์ไม่ถูกต้อง

ฉันกำลังทำอะไรบางอย่างเช่น

[objectName methodName:@"somestring" lat:latValue lng:lngValue];

แต่ในความหมาย (ทั้ง. h และ. m) ฉันมี

(viod) methodName:(NSString *) latitude:(double)latitude longitude:(double)longitude;

สิ่งนี้ทำงานได้ดีบน iOS5 แต่ไม่ใช่ใน 6 แม้แต่รุ่นเดียวกันที่ปรับใช้กับอุปกรณ์ต่าง ๆ

ฉันไม่เข้าใจว่าทำไมคอมไพเลอร์จึงไม่บอกเรื่องนี้กับฉัน - แก้ปัญหาแล้ว


0

สิ่งนี้อาจเกิดขึ้นเมื่อคุณต้องการตั้งค่าคุณสมบัติจาก ControllerA เป็นคุณสมบัติสาธารณะภายในคลาส ControllerB แบบกำหนดเองและคุณยังไม่ได้ตั้งค่า "คลาสแบบกำหนดเอง" ภายในตัวตรวจสอบตัวตนในสตอรี่บอร์ด


0

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

ฉันจัดสรร xib ที่แตกต่างให้กับ UIVIewController เดียวกันและแม้หลังจากค้นหาทุกที่ฉันไม่สามารถหาวิธีแก้ไขได้ จากนั้นฉันตรวจสอบ AppDelegate ของฉันที่ฉันโทรมาinitWithNibNameและเห็นว่าในขณะที่คัดลอกรหัสฉันเปลี่ยนชื่อ xib แต่ลืมเปลี่ยนUIViewControllerคลาส ดังนั้นหากไม่มีวิธีใดที่เหมาะกับคุณให้ตรวจสอบinitWithNibNameวิธีการของคุณ


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