2017-05-01 19 views
-1

[解決済み]復元状態プロトコルを使用して、コードでプログラムでビルドされたものを取得しようとしましたが、構文は良好ですが動作しないようです。 私のコードでUIButtonを開発しましたが、UIImageViewをクリックするとそれが作成されますが、アプリケーションを終了して戻ってくるとUIImageViewはもう作成されません。ここで コードです:iOSの復元状態

class ScrollViewController: UIViewController, UIScrollViewDelegate { 
var x1 = 200 
var testpost = UIImageView() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let addButton = UIButton(frame: CGRect(x: 10, y: 20, width: 100, height: 40)) 
    addButton.backgroundColor = .black 
    addButton.setTitle("add a note", for: .normal) 
    addButton.addTarget(self, action: #selector(buttonAction), for: .touchUpInside) 
    self.view.addSubview(addButton) 
    } 

func buttonAction(sender: UIButton!) { 
    x1 = x1 + 30 
    testpost = UIImageView(frame:CGRect(x: x1,y: 0,width: 240,height: 240)) 
    testpost.image = UIImage(named:"Screenshots 2017-04-18 at 19.41.04") 
    view.addSubview(testpost) 
    testpost.restorationIdentifier = "testpostId" 

} 

override func encodeRestorableState(with coder: NSCoder) { 
    if let imagge = testpost.image { 
     coder.encode(UIImagePNGRepresentation(imagge), forKey: "testpostId") 
    } 
    super.encodeRestorableState(with: coder) 

} 
override func decodeRestorableState(with coder: NSCoder) { 
    if let imagge2 = coder.decodeObject(forKey: "testpostId") as? Data { 
     testpost.image = UIImage(data: imagge2) 
     super.decodeRestorableState(with: coder) 
    }}} 

私はそれを殺した後、アプリを起動すると、それが終了する前に同じ位置にあった、しかし私は、スクロールビューを試してみました、それがうまく動作します。

は、私はまた、AppDelegateでこれを追加しました:

func application(_ application: UIApplication, shouldSaveApplicationState coder: NSCoder) -> Bool { 
    return true 
} 

func application(_ application: UIApplication, shouldRestoreApplicationState coder: NSCoder) -> Bool { 
    return true 
} 

は私が直接、絵コンテから、また私のビューコントローラに復元同上を与えました。 私はエラーはありませんが、何も保存されていません。私の間違いはどこですか? ありがとうございます!

ソリューション、追加:

super.decodeRestorableState(with: coder) 

testpost.frame = CGRect(x: x1,y: 0,width: 240,height: 240) 
view.addSubview(testpost) 

をそして、それは動作します:)コメントから、あなたの助け

+0

関数decodeRestorableStateはこれまでに呼び出されていますか?それは画像のデータを検索し、そのデータは妥当であるかどうか? –

+0

'encodeRestorableState'と' decodeRestorableState'が呼び出されるようにブレークポイントを追加しましたか?そうであれば、イメージを 'testpost'に割り当てても、実際には復元中に画面に追加することはありません。 –

+0

@ScottThompson実際に呼び出されたかどうかはどうすればわかりますか? 私は2つの関数shouldSaveとshouldRestoreを追加すれば十分だろうと思いましたか? また、私のアプリはデータを保存しているようです。私のアプリを起動すると、ちょっとだけ終了する前の状態に正確に戻ってしまいます。それが消えて、起動時の状態に戻ります。最初のアプリ(その明確でない場合私に教えてください) – VH24

答えて

0

のためにありがとうが正常にイメージをロードしているように、それが見えますtestpost、復元が機能しています。しかし問題は、testpostviewに追加するか、testpostのフレームを設定するコードを決して実行しないことです。イメージビューに保存されたイメージは、復元する必要がある状態の一部に過ぎません。

あなたは、あなたが期待しているかを確認する必要がありdecodeRestorableStateに以下を追加した場合、少なくとも一つのイメージのために:

x1 = x1 + 30 
testpost.frame = CGRect(x: x1,y: 0,width: 240,height: 240) 
view.addSubview(testpost) 

あなたのコードは、現在ボタンが複数回(押されていますケースを処理しません。常にゼロまたは1つの画像を表示するだけです)しかし、ここからそれを動作させることができるはずです。

+0

それは動作します!どうもありがとうございました ! それは私を助けようとしている! :) – VH24

関連する問題