سؤال

أحتاج إلى أن يفتح تطبيقي نافذة عندما ينقر المستخدم نقرًا مزدوجًا على صف في ملف NSTableView.أواجه صعوبة كبيرة في العثور على معلومات أو أمثلة حول كيفية تحقيق ذلك.أي شخص يمكن لي نقطة في الاتجاه الصحيح؟

هل كانت مفيدة؟

المحلول

ونلقي نظرة على في -setDoubleAction: طريقة على NSTableView. يمكنك تعيين هذا إلى الأسلوب الذي سوف يطلق تماما مثل النظام المستهدف للعمل العادي ولكن على انقر نقرا مزدوجا فوق.

في هذا الأسلوب العمل، <وأ href = "http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTableView_Class/Reference/Reference.html#//apple_ref/occ/instm/NSTableView / clickedRow "يختلط =" noreferrer "> -clickedRow سيكون مفيدا.

نصائح أخرى

إضافة المزيد من المعلومات الأساسية إلى إجابةJimPuls لصالح الوافدين الجدد الآخرين إلى Cocoa.

  1. يجب الإعلان عن IBOutlet إلى NSTableView في الواجهة.افترضت أنه من المفضل القيام بذلك في مندوب الجدول.
  2. يجب توصيل IBOutlet بالجدول عبر Interface Builder.للقيام بذلك، اضغط على Ctrl-Drag & Drop في IB من الفئة التي تعلن عن منفذ عرض الجدول.عند تحرير الماوس، يجب أن تظهر نافذة منبثقة باسم المنفذ الذي أعلنته في الخطوة رقم 1.حدد ذلك.
  3. في قسم @implementation، في الأسلوب -awakeFromNib، اتصل بـ -setTarget:و -setDoubleAction:على IBOutlet المعلن عنه في الخطوة رقم 1 والمتصل في الخطوة رقم 2.

إليك مقتطف من مندوب عرض الجدول الخاص بي.لقد قمت أيضًا بإعداد المفوض الخاص بي كمصدر بيانات، ولهذا السبب سترى كلاً من واجهات NSTableViewDelegate وNSTabeViewDataSource المرتبطة به.

// مقتطف من الواجهة.

@interface MyTableViewDelegate : NSObject <NSTableViewDelegate, NSTableViewDataSource>
{
  // This iVar needs to be connected to the table view via the IB.
  IBOutlet NSTableView *tableOutlet;
}

@property (assign) IBOutlet NSTableView *tableOutlet;

- (void)doubleClick:(id)nid;

@end

// مقتطف من التنفيذ.

@implementation MyTableViewDelegate

@synthesize tableOutlet = _tableOutlet;

- (void)awakeFromNib {
  [_tableOutlet setTarget:self];
  [_tableOutlet setDoubleAction:@selector(doubleClick:)];
}

- (void)doubleClick:(id)object {
  // This gets called after following steps 1-3.
  NSInteger rowNumber = [_tableOutlet clickedRow];
  // Do something...
}

أتمنى أن يساعدك هذا.

كما قال PR Singh، يمكنك استخدام روابط الكاكاو، ويمكنك أيضًا تمرير الكائنات المحددة.

  1. حدد عرض الجدول الخاص بك في IB ثم في مفتش Bindings قم بتعيين هذين الارتباطين على النحو التالي:

    >Double Click Target
    
    bind to = Application delegate object (or file owner)
    model key path = self
    selector name = myMethod:
    
    >Double Click Argument
    
    bind to = array controller
    controller key = selectedObjects
    selector name = myMethod:
    

حيث يتم تنفيذ myMethod كـ

- (void)myMethod:(NSArray*)selectedObjects
{
    NSLog(@"%@", selectedObjects);
}

وهذا موثق هنا أيضاً:https://developer.apple.com/library/mac/qa/qa1472/_index.html

إذا شخص ما يبدو لسريع الإصدار 2.0: هذا هو ما يعمل بالنسبة لي. يبدو أسهل بكثير من رمز C الهدف.

@IBOutlet weak var searchResultTable: NSTableView!

override func viewDidLoad() {
    super.viewDidLoad()
    searchResultTable.doubleAction = "doubleClickOnResultRow"
}

func doubleClickOnResultRow()
{
    print("doubleClickOnResultRow \(searchResultTable.clickedRow)")
}

يمكنك ربط إجراء النقر المزدوج في Interface Builder.انقر مع الضغط على مفتاح التحكم على عرض الجدول (تأكد من حصولك على عرض جدول, ، وليس عرض التمرير أو عرض المقطع أو عمود الجدول) للحصول على لوحة الاتصالات الخاصة به.ابحث عن عنصر "doubleAction" في قسم "الإجراءات المرسلة".قم بتوصيله بـ IBAction الذي تختاره.

في SWIFT 4.1 تعيين طريقة doubleAction الكائن TableView داخل التعليمات البرمجية لأداء وظيفةobjc باستخدام #selector (nameOfYourFunction)

وداخل هذه الوظيفة استدعاء سغ]. يمكنك ربط نافذة جديدة إلى إطار الأصل على InterfaceBuilder (وليس إلى كائن NSTableView لكن الكائن ViewController الفعلي.

وبعد ذلك تفعل كل ما تبذلونه الإعداد للنافذة جديدة على الاستعداد لسغ]:

وحسنا أولا على واجهة البناء:

وبالطبع إعطاء معرف إلى أن سغ]:

وبعد ذلك، داخل تحكم العرض الأول لدينا (حيث يرى الجدول) رمز:

 //We use this function: prepare for segue
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
        // check if we are referring to the actual segue we want
          if segue.identifier?.rawValue == "segueToYourNewWindow" {
    // now create a reference to that new window
            let yourNewWindow = segue.destinationController as! newWindowViewController
    // now change variables inside that view controller code, remember that the objects might fail if they are not yet visible to the user so first set up the variables or call them using the main thread, up to your design.
           yourNewWindow.selectedRowVariable = thisTableView.clickedRow
        }

وبعد ذلك نحن بحاجة إلى وظيفة لأداء سغ] على النقر المزدوج على عرض الجدول، وهذا ما يسمى وظيفة مع #selector وبالتالي يجب أن يكون مرئيا بالهدف C (حتى أننا برمجة في سويفت) ونحن ببساطة بدء وظيفة معObjc thats عليه.

@objc func doubleClickOnResultRow() {
//beware of double-clicking also triggers this function when no rows is selected with the selectedRow being -1
 if (thisTableView.selectedRow > -1 ) {
  performSegue(withIdentifier: NSStoryboardSegue.Identifier(rawValue: "segueToYourNewWindow"), sender: nil)
 }
}

وأخيرا وضعنا هذه الوظيفة لطريقة doubleAction من TableView في الجزء الإعداد الأولي من التعليمات البرمجية لدينا مثل هذا:

override func viewDidLoad() {
    super.viewDidLoad()
    thisTableView.doubleAction = #selector(doubleClickOnResultRow)
}

ويمكنك أن تفعل الشيء نفسه مع الارتباطات، أولا وقبل كل إعلان mentod واحد في ملف .h

-(IBAction)openWindow:(id)sender

وفي .M ملف تنفيذ نفسه

-(IBAction)openWindow:(id)sender
{
    //do something here;
}

وصلت إلى أن بنك الاستثمار القومي حيث عرض الجدول الخاص بك موجود حدد عرض الجدول وحصلت على ثاني التبويب الأخير من مفتش السمة، فتح مزدوج حجة cicl مأزق الاختيار الكشف مثلث للتحقق مالك الثعلب حدد الملف، يجب أن يكون نموذج بات أساسيا "النفس "، اسم محدد ستكون" openWindow: "نفس العملية تفعل مع" الكشف انقر نقرا مزدوجا فوق الهدف "، وهذا العمل

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top