2011-01-12 9 views
9

मैं हटाएं कुंजी दबाकर NSTableView पंक्तियों को हटाने का एक आसान समाधान ढूंढ रहा हूं। मैंने देखा है कि Google में खोज करते समय इस तरह के उत्तर दिए गए थे: http://likethought.com/lockfocus/2008/04/a-slightly-improved-nstableview/। यह मुझे एक इंजीनियरिंग समाधान लगता है, लेकिन मैं जानना चाहता हूं कि यह सबसे अच्छा तरीका है या नहीं। क्या कोई भी बेहतर जवाब जानता है?NSTableView + हटाएं कुंजी

उत्तर

12

मैंने LTKeyPressTableView के समान कुछ लागू किया है। हालांकि, मैं सरणी नियंत्रकों का उपयोग करता हूं, इसलिए मेरे सबक्लास में मैंने IBOutlet NSArrayController * relatedArrayController जोड़ा। एक प्रतिनिधि में डिलीट अनुरोध को संभालने के बजाय, मैं इसे सबक्लास में सीधे संभालता हूं क्योंकि मेरा सबक्लास विशेष रूप से हटाएं कुंजी को संभालने के साथ संबंधित है। जब मैं डिलीट कुंजी के लिए कीप्रेस का पता लगाता हूं, तो मैं बस [relatedArrayController delete:nil]; पर कॉल कर रहा हूं।

IRTableView.h:

#import <Cocoa/Cocoa.h> 

@interface IRTableView : NSTableView { 
    IBOutlet NSArrayController * relatedArrayController; 
} 

@end 

और IRTableView.m:

#import "IRTableView.h" 


@implementation IRTableView 


- (void)keyDown:(NSEvent *)event 
{ 
    // Based on LTKeyPressTableView. 
    //https://github.com/jacobx/thoughtkit/blob/master/LTKeyPressTableView 

    id delegate = [self delegate]; 

    // (removed unused LTKeyPressTableView code) 

    unichar key = [[event charactersIgnoringModifiers] characterAtIndex:0]; 
    if(key == NSDeleteCharacter) 
    { 
     if([self selectedRow] == -1) 
     { 
      NSBeep(); 
     } 

     BOOL isEditing = ([[self.window firstResponder] isKindOfClass:[NSText class]] && 
          [[[self.window firstResponder] delegate] isKindOfClass:[IRTableView class]]); 
     if (!isEditing) 
     { 
      [relatedArrayController remove:nil]; 
      return; 
     } 

    } 

    // still here? 
    [super keyDown:event]; 
} 

@end 

अंत परिणाम मेरे लिए काफी आईबी के अनुकूल है, और एक कोको बाइंडिंग + कोर में उपयोग के लिए एक काफी सरल समाधान डेटा एप्लीकेशन

26

मैं आमतौर पर जो करता हूं वह आपके एप्लिकेशन के मेनू बार में एक नया मेनू आइटम बनाता है। कुछ की तरह:

File -> Delete ${Name of Item}

तो फिर तुम एक IBAction विधि या तो अपने अनुप्रयोग प्रतिनिधि या किसी अन्य नियंत्रक पर कहीं न कहीं परिभाषित करने के लिए बात करने के लिए इंटरफ़ेस बिल्डर में है कि NSMenuItem लिंक कर सकते हैं। इस विधि के कार्यान्वयन को आपके मॉडल से आइटम को हटाना चाहिए, और NSTableView रीफ्रेश करना चाहिए।

  1. आप आइटम इंटरफ़ेस बिल्डर में कीबोर्ड शॉर्टकट दे सकते हैं:

    लाभ एक NSMenuItem कार्रवाई से बाहर करने के लिए है। (हटाएं कुंजी की तरह।)

  2. उपयोगकर्ता जो आपके एप्लिकेशन से परिचित नहीं हैं, डिलीट कुंजी दबाए जाने से डरते हैं, या किसी भी कारण से कीबोर्ड तक पहुंच नहीं है, फिर भी इस कार्यक्षमता का उपयोग कर सकते हैं।
+1

हाय, क्रेग। आपका जवाब वह नहीं था जो मैं वास्तव में उम्मीद कर रहा था, लेकिन यह बहुत अच्छा लगता है! = डी बहुत बहुत धन्यवाद। – Leandro

+2

हाहा हाँ, सबसे पहले यह एक सुंदर अप्रत्यक्ष दृष्टिकोण की तरह लगता है, लेकिन यह बहुत अच्छी तरह से काम करता है, और बहुत सारे सिरदर्द का ख्याल रखता है। –

+0

जब तक आपके पास दो टेबल दृश्य नहीं हैं ... – peetonn

9

10.10 के बाद, NSViewController उत्तरदाता श्रृंखला का हिस्सा है। तो सबसे आसान तरीका है अपने उप-वर्गीकृत NSViewController

+1

सबक्लासिंग (जहां संभव हो) से बचने के लिए प्रतिक्रियाकर्ता श्रृंखला का उपयोग करने के बारे में अच्छा बिंदु। –

4

NSViewController में keyDown को उपclass और पकड़ने की आवश्यकता नहीं है।

Delete मेनू में मेनू आइटम Edit पहले उत्तरदाता के चयनकर्ता delete: से जुड़ा हुआ है। यदि Delete मेनू आइटम नहीं है, तो एक बनाएं और इसे पहले उत्तरदाता (लाल घन) के delete: से कनेक्ट करें।

  • Delete मेनू आइटम ( या ⌘⌫) दृश्य नियंत्रक में
  • के लिए एक महत्वपूर्ण बराबर निरुपित IBAction तरीका लागू

    स्विफ्ट: @IBAction func delete(_ sender: AnyObject)

    Objective- सी: -(IBAction)delete:(id)sender

    और तालिका दृश्य पंक्ति को हटाने के लिए तर्क में डाल दिया गया है।

संबंधित मुद्दे