2015-04-22 4 views
1

Ищете помощь. У меня есть сам объявленный объект, где у меня есть две даты и примечания свойств. в коде, указанном ниже, могут быть указаны в объекте с инстанцированным объектом, но примечание не может. Есть идеи?«AnyObject» не имеет члена с именем «note»

Это подробный контроллер, где есть ошибки. Строки 10 и 20.

import UIKit 

class DetailViewController: UIViewController { 


@IBOutlet weak var tView: UITextView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
tView.text = allNotes[currentNoteIndex].note 
tView.becomeFirstResponder() 
} 

override func viewDidDisappear(animated: Bool) { 
    super.viewWillDisappear(animated) 
    if tView.text == "" { 
     allNotes.removeObjectAtIndex(currentNoteIndex) 
    } 
    else { 
     allNotes[currentNoteIndex].note = tView.text 
    } 
    Note.saveNotes() 
    noteTable?.reloadData() 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


} 

Вот файл note.swift, в котором вы можете увидеть переменные.

import UIKit 

var allNotes:NSMutableArray = [] 
var currentNoteIndex:Int = -1 
var noteTable:UITableView? 

let KAllNotes:String = "notes" 


class Note: NSObject { 
var date:String 
var note:String 

override init() { 
    date = NSDate().description 
    note = "" 
} 

func dictionary() -> NSDictionary { 
    return ["note":note, "date":date] 
} 

class func saveNotes() { 
    var aDictionaries:NSMutableArray = [] 
    for var i:Int = 0; i < allNotes.count; i++ { 
     aDictionaries.addObject(allNotes[i].dictionary()) 
    } 
//  NSUserDefaults.standardUserDefaults().setObject(aDictionaries, forKey: KAllNotes) 
    aDictionaries.writeToFile(filePath(), atomically: true) 
} 

class func loadnotes() { 
    var defaults:NSUserDefaults = NSUserDefaults.standardUserDefaults() 
//  var savedData:[NSDictionary]? = defaults.objectForKey(KAllNotes) as? [NSDictionary] 
    var savedData:NSArray? = NSArray(contentsOfFile: filePath()) 
    if let data:NSArray = savedData { 
     for var i:Int = 0; i < data.count; i++ { 
      var n:Note = Note() 
      n.setValuesForKeysWithDictionary(data[i] as! [NSDictionary : AnyObject]) 
      allNotes.addObject(n) 
     } 
    } 
} 

class func filePath() -> String { 
    var d:[String]? = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String] 
    if let directories:[String] = d { 
     var docsDirectory:String = directories[0] 
     var path:String = docsDirectory.stringByAppendingPathComponent("\(KAllNotes).notes") 
     return path; 
    } 
    return "" 
} 
} 
+0

Это происходит потому, что вы используете NSMutableArray хранить ваши заметки, которые не печатаются. Итак, у вас есть два варианта. 1. Сохраните заметки в массиве Swift типа «Array ' ('[Note]'). 2. Перед тем как перейти к его свойствам, отправьте свой объект в виде примечания. Я также предлагаю хранить ваши заметки альтернативным способом вместо использования глобальных переменных. – Ian

ответ

3

Поскольку вы объявили allNotes как NSMutableArray, компилятор не имеет возможности узнать тип его элементов, поэтому каждый объект будет рассматриваться как AnyObject.

Вам необходимо предоставить компилятору информацию, которую allNotes содержит объекты типа Note.

Вы можете либо бросить объект при извлечении его из массива

(allNotes[currentNoteIndex] as! Note).note 

или (предпочтительно) использовать набранный быстрый массив

var allNotes: [Note] = [] 
+0

Top line работал. огромное спасибо – ShizukaNaHaji

1

Это происходит потому, что allNotes не тип Note. Таким образом, по соображениям безопасности вы должны объявить var allNotes:NSMutableArray = [], как var allNotes = [Note]()

+0

Подумайте о том, чтобы добавить объяснение, почему это необходимо, @ комментарий Bluehound затрагивает это. – Wez

+0

@Wezly O спасибо, я уточню ответ сейчас –

Смежные вопросы