絵を描くアプリで線はundo,redoできるのですがimageviewがundo,redoできません。

投稿者: Anonymous スクロールビューの下にimageViewを配置してあります。 @IBOutlet weak var scrollView: UIScrollView! @IBOutlet weak var canvasView: UIImageView! var saveImageArray = [UIImage]() //Undo/Redo用にUIImage保存用 // タップされた座標にflowerを追加する(buttonをクリックした時の処理) let flower = UIImageView(image: UIImage(named: “flower”)) flower.center = (sender as AnyObject).location(in: self.view) **canvasViewの拡大を可能にしたい為、addSubView(flower)にしたら簡単にタップ位置にimageの大きさで表示されかつ拡大出来たので良かったのですが、結果としてSubViewとcanvasViewでは格納場所が違うようで以降のundo処理が出来ない状態です。 描いた線,画像の拡大,縮小が出来てundo,redo処理が出来る様に考えています。 現在の記述で描いた線,画像の拡大,縮小は出来るのだが,画像のredo,undoが出来ないです。 (この処理の中には線の記述はないです) canvasView.addSubview(flower) //配列にcanvasView.imageを保存 currentDrawNumber += 1 saveImageArray.append(canvasView.image!) //保存している直前のimageに置き換える (undoボタンをクリツクした時の処理) @IBAction func pressUndoButton(_ sender: Any) { if currentDrawNumber <= 0 {return}…(Continue Reading)

XcodeでMGIsDeviceOneOfType is not supported on this platform.と表示されてしまいます

投稿者: Anonymous XcodeをVersion 10.0 (10A255)にバージョンアップしました。SwiftのプラグラムをiPhone8 Simulatorで実行すると以下のエラーが表示されるようになりました。また、iPhone X/XR/XS/XS MaxのSimulatorでは以下のエラーは表示されません。なにか、地図関係か何かに変化があったのでしょうか? ご存知の方があれば ご教授ください。 2018-09-19 14:41:26.945506+0900 VoiceToDo1[13120:353456] libMobileGestalt MobileGestalt.c:890: MGIsDeviceOneOfType is not supported on this platform. 解決 同内容のスレッドが、AppleのDeveloper Forumsにありました。 What is MGIsDeviceOneOfType 残念ながらAppleの技術者からのコメントはありませんが、「新しいSDKにありがちな、フレームワークの内部メッセージ(フレームワーク開発者が仕込んだデバッグメッセージ)だろう。今の所実害はないし無視して大丈夫そうだ。」と言うところに落ち着いたようです。 本家StackOverflowのスレッドがこちら。 Xcode Error on Simulation 回答ではなくコメントに「シミュレータじゃなくデバイスで実行(Xcode10正式版、10A255のこと)したらメッセージは出ない」と言う報告もあるので、やはり無視しても問題ないのではないかと思われます。 何やら「自分はこうしたら解決した」と言うやり方を書いている方もいるのですが、それが正しい解決方法だと言う確証がないので、たまたまいろんな要因が重なってその時点で解決できたように見えただけ、と言う可能性も高そうです。 下手に真似すると自分のプロジェクトを壊してしまう可能性もあるので、メッセージが出てくる以外に実害が無いのでしたら、無視した方が良いのではないかと思います。(AppleのSDKの一部には、そんなメッセージが出るものが時々あります。) 回答者: Anonymous

CaseIterableはSwift4.2から使えるとネットにあるが、Swift4で動いているように感じる

投稿者: Anonymous 画像のようにSwift4を設定しています。 ネットにはSwift4.2から使えると書いています。 しかしCaseIterableを書いてみるとコンパイルが通り正常に動きました。 なぜでしょうか? 参考: – https://www.hackingwithswift.com/articles/77/whats-new-in-swift-4-2 – https://dev.classmethod.jp/smartphone/iphone/wwdc18-swift-4-2-case-iterable/ 解決 Swift 4どころか、Swift 3を指定しても、CaseIterableが使えませんか? Xcode 10.xに付属するSwiftコンパイラは、Swift 4.2.xであり、リンクされるSwift標準ライブラリもSwift 4.2用のものです。 Build Settingsにある、Swift Language Versionは、あくまでもSwift 4.2コンパイラをどのモードで走らせるかという指定であり、動作がSwift 3コンパイラやSwift 4コンパイラと全く同じになるわけではありません。Swift 4.2で導入された機能のうち、Swift 3モードやSwift 4モードの動作と矛盾しないものは、それらのモードを指定しても使えたりします。 また構文は全く変わらないままSwift標準ライブラリの挙動が変更になっている場合などは、Swift 3/4を指定していても、Swift 4.2標準ライブラリの挙動となります。 CaseIterableの他にもSwift 4.2で導入された機能(下の例はoffset(of:))がSwift 3/4モードで動くかと思います。試してみてください。 struct MyStruct { var i32: Int32 var i16: Int16 } if let offs = MemoryLayout.offset(of: MyStruct.i16) { print(offs) //-> 4…(Continue Reading)

swiftでWAVファイルを読み込みたい

投稿者: Anonymous 拡張子が.wav形式のファイルを読み込みたいのですが、できません。 XcodeはVersion 9.0.1 でswiftはversion 4.0です。 .wavファイルから最終的にデータ部分をIntやFloatのarrayとして取り出したいです。 下記のソースコードは http://atmarkplant.com/ios-wav-file-read/ をもとに書きました let orgWaveData:NSData = try NSData(contentsOfFile:”/Users/username/Desktop/sample.WAV”,options:[]) let subWaveData:NSData = orgWaveData.subdata(with: NSMakeRange(44, orgWaveData.length-44)) as NSData let sample = malloc(subWaveData.length) memcpy(sample, subWaveData.bytes, subWaveData.length); また、AudioToolboxを使いできないかと思い、下記のようなコードでも試してみましたが、 resultが-54という結果で、うまく取得できていませんでした。 import AudioToolbox let filePath = “/Users/username/Desktop/sample.WAV” let url: CFURL = NSURL(fileURLWithPath: filePath) var dataPointer:AudioFileID? let filetype = kAudioFileWAVEType let result = AudioFileOpenURL(url,.readPermission,filetype,…(Continue Reading)

cellの外側を確立することはできるのか

投稿者: Anonymous 今、collectionViewのcellの外をタップしたときに画面遷移したいのですがcollectionViewCellの外側というのを判定することができません。 下の写真の黄色い部分です。 画面遷移のコードは outsideCell.gestureRecognizers = [UITapGestureRecognizer(target: self, action: #selector(self.outsideTouch(_:)))] 教えていただけないでしょうか。 解決 UICollectionView で表示してる cell の外側をタップされた時にコードを実行したいということでしたら、UICollectionView の backgroundView に UITapGestureRecognizer を追加した UIView を追加してください。 import UIKit final class ViewController: UIViewController { @IBOutlet private weak var collectionView: UICollectionView! override func viewDidLoad() { super.viewDidLoad() let view = UIView(frame: .zero) let recognizer = UITapGestureRecognizer(target: self, action: #selector(handleCollectionViewBackgroundTap(_:))) view.addGestureRecognizer(recognizer)…(Continue Reading)

ボタンに画像を貼りたいのですがうまくいきません

投稿者: Anonymous 今回、UIButtonにimageを挿入しようと試みたのですがなぜかtintcolorしか見えません。 コードは下のような感じです。   class ViewController: UIViewController{ var button: UIButton! let image = UIImage(named: “Image”) override func viewDidLoad() { super.viewDidLoad() let button = UIButton(type: .system) button.setImage(image, for: .normal) self.view.addSubview(button) } } 解決 UIButton().setImage(image, for: .normal)ということは Buttonを新規に作成(UIButton())し、そのButtonに画像をセットしなさい。という命令だと思います。 これだけだと、新規に作成したボタンなので、表示したい画面のViewにaddSubviewしないと画像を貼ったボタンは画面に表示されないのではないでしょうか? 多分、行うべきは、 Storyboardに置いたボタンを@IBOutletでソースから参照できるようにし、そのボタンにsetImageする UIButton().setImage(image, for: .normal)で作成したボタンを表示したいviewにaddSubviewして、frameRectプロパティを変更することで目的の位置に移動させる UIButton().setImage(image, for: .normal)で作成したボタンを表示したいviewにaddSubviewして、AutoLayoutのlayout制約を設定することで目的の位置に配置する の、いずれかを行う必要があると思います。 3/21 追記 イメージボタンを作成するときに、type:パラメーターを.customにする必要があるようです。 下記にこちらで確認出来たサンプルを貼っておきます。 class ViewController: UIViewController {…(Continue Reading)

エラーの意味がわかりません、どなたか解決方法を教えてください。

投稿者: Anonymous ボタンの生成時にエラーが2つでました。 func makeButton(frame: CGRect, text: String, tag: Int) -> UIButton { let button = UIButton(type: UIButton.ButtonType.system) button.frame = frame button.setTitle(text, for: UIControl.State.Normal) //エラー文→【●’Normal’ is unavailable: use [] to construct an empty option set 】  button.tag = tag button.addTarget(self, action: #selector(onClick(_:)), //エラー文→【 ●Use of unresolved identifier ‘onClick’】 forControlEvents: UIControlEvents.TouchUpInside) return button } 以上の様なエラーが出てしまいます。ザックリな質問ですみません。よろしくお願いします。 解決…(Continue Reading)

Pasar información de un UIViewController a otro documento

publicado por: Anonymous Me gustaría saber cual es la manera más eficiente de pasar información de un archivo Swift a otro por ejemplo de un ViewController a el modelo de datos o a otro View que nos interese, gracias de antemano. UIViewController1 Aqui un primer archivo func prueba() -> String{ return “ejemplo”} Con esta función…(Continue Reading)

タッチしたUIimageView(複数)を移動、削除させる方法を教えてください。

投稿者: Anonymous タッチしたところに四角(UIImageView)を作成することは出来たのですが、その複数作成した中の一つの四角をタップしたら、削除。また、ドラッグしたら移動する。ようなプログラムがどうしても書けません。 現状は下記のコードで、 ・何もないところに四角の作成。 ・一番最後に作成した四角をドラッグする。 は実装できました。 作成段階で整理されていないコードですが、お願いします。 import UIKit var pointX: CGFloat = 0.0 var pointY: CGFloat = 0.0 var w: CGFloat = 50 var h: CGFloat = 50 var flag: Int = 0 class ViewController: UIViewController { @IBOutlet var tapG: UITapGestureRecognizer! @IBOutlet weak var ImageView: UIImageView! @IBOutlet weak var view_safe: UIView! var boxViewArray:…(Continue Reading)

UITableViewControllerを使ってsegueする時にindexPathForSelectedRowが参照できない

投稿者: Anonymous UITableViewControllerを使ってcellが選択された時にPlayBackViewController(UIViewController)へsegueしたいのですがprepare(for segue:で let myIndexPath = self.tableView.indexPathForSelectedRow とすると以下のエラーが出ます。(添付コードの下から5行目) Ambiguous reference to member ‘tableView(_:numberOfRowsInSection:) だれかお知恵をお貸しください。 import UIKit class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { @IBOutlet weak var tableVIew: UITableView! let voiceTextArray = [“11111″,”222222″,”333333″,”444444″,”55555”] let dateTimeArray = [“dateTime1″,”dateTime2″,”dateTime3″,”dateTime4″,”dateTime5”] override func viewDidLoad() { super.viewDidLoad() tableVIew.delegate = self tableVIew.dataSource = self } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func numberOfSections(in tableView:…(Continue Reading)

iOSのKeychain Serviceについて

投稿者: Anonymous keychainを使った実装を行おうとしてて、一つ気になったことがあったので質問させていただきました。 Keychain Serviceに格納できる型について質問なんですが、String型とData型以外の型は、そのまま格納できず工夫(Data型などに一旦変換する)をしないといけないんでしょうか。 単純な質問で恐れ入りますが、何卒ご教授のほどよろしくお願いします。 解決 Keychain Serviceに格納できる型について質問なんですが、String型とData型以外の型は、そのまま格納できず工夫(Data型などに一旦変換する)をしないといけないんでしょうか。 その通りです。もっと正確にいうと、Keychain ServiceのAPIはCFData型(=Data/NSData)しか受け付けないため、StringさえもData型に変換して格納する必要があります。 回答者: Anonymous

iCloudに他のアプリでも参照出来るように保存したい

投稿者: Anonymous 以下のアドレスのHPや参考書を参照してiCloudにデータ保存をしましたが、保存したものをmacのFinderやiOSのブラウズ等で見えるように保存することが出来ません。 保存に使用しているコードです。 DispatchQueue.global().async(execute: { if let containerURL = FileManager.default.url(forUbiquityContainerIdentifier: nil) { let documentsURL = containerURL?.appendingPathComponent(“Documents”) let fileURL = documentsURL?.appendingPathComponent(self.backupFileName) do { try strResults.write(to: fileURL!, atomically: true, encoding: .utf8) } catch { print(“write error”) } } }) 参考にしたサイト: iCloudに保存したテキストファイルで書き込み・読み込み (下記サイトの「iCloudファイルのストレージコンテナ」の項目) ファイルシステムプログラミングガイド – ファイルシステムの基礎 上記公式ドキュメントに、 Documentsサブディレクトリ(またはそのサブディレクトリの1つ)内のすべてのファイルまたはファイルパッケージは、 個別に削除できる独立したドキュメントとして(OS XとiOSのiCloud UIを通じて)ユーザに表示されます。 とあります。これはMacのFainderのiCloud項目などで見えるという意味ではない? どのようにしたら良いのか、または解説のあるページ、何でも良いので教えていただけたら幸いです。 よろしくお願いいたします。 追記:もしかすると、このあたりが関係するのでしょうか? DocumentBrowser を使ったアプリの実装方法…(Continue Reading)

swiftのニュースリーダーアプリでサムネイル画像を表示する方法について

投稿者: Anonymous テーブルビューを使ってニュースリーダーアプリを作っています。 RSSからタイトルやリンクを取得して、テーブルビューに表示するところまでは出来たのですが RSSからサムネイルを取得する方法が分かりません。 RSSからどのようにすればサムネイル画像を取得し、それをテーブルビューのセルに表示できるのでしょうか。 解決 RSSにサムネイル画像の情報が含まれていないのであれば、指定したURL(webページ)のキャプチャ画像を生成してくれるサービスがいくつかあるのでこれらを利用する方法が考えられます。 Page2Images 指定URLのPC・タブレット・スマホの「キャプチャ画像」を自動表示するデモアプリを作ってみた! – paiza開発日誌 回答者: Anonymous

配列処理中に別のオブジェクトなどからアクセスするとどのような挙動になるのか

投稿者: Anonymous 環境:Mac/High Sierra 10.13.6/swift4.2/xcode 10.0 ある配列オブジェクトに対して、自分自身や他のいくつかのオブジェクトからの処理要求が同時に起こる可能性がある場合、命令通りに同時に処理が行われますでしょうか。 例えば、配列でappend()をたくさん行う必要がある時に、この処理が行われている途中で他のオブジェクトなどからこの配列を参照するとどのようになりますでしょうか。 処理中のアクセス防止には排他処理を行うしか方法はありませんでしょうか。 排他処理でも良いと思っていますが、他にも方法がある場合知りたいです。 解決 原則、スレッド間で共有するリソースであって複数個数のデータが入るもの(クラスなり配列なりリストなり)を、マルチスレッドで同時操作する場合には必ず排他制御が必要です。1つのデータであってもアトミックアクセスできないものは排他なり、処理系が提供していればアトミック操作命令が必要です。 例:座標データ (x, y) があるとき、排他しないと – スレッド1が x を読む – スレッド2が x を書く – スレッド2が y を書く – スレッド1が y を読む と、スレッド1が処理しようとする座標は旧値でも新値でもない壊れた値となります。 例: 32bit CPU で 64bit 変数1つを扱うとき、排他しないと – スレッド1が下位 32bit を読む – スレッド2が下位 32bit を読む – スレッド2が上位 32bit を読む – スレッド2は 64bit 値に対して演算を行う…(Continue Reading)

毎度処理させるか変数に格納するかの見極め方について

投稿者: Anonymous お世話になっております。 都度更新される情報において、いつも以下のことで思い悩むことがあります。 例えば、キャラクターがマップ上を歩き視界範囲に何があるかチェックするようなシーンです。歩くので座標がいつも変わります。視力はだいたいが固定です(メガネ、コンタクト、晴れた日、雨の日、霧の日があるかも知れません)。 ・毎度処理させるか ・中間値(ここでは視力)を変数に保管しとき、これを元に処理を簡略させるか ハードのスペックとか、プログラム言語の性質とかあるかも知れません。その知識や調べ方が分からなく、そこまでハードリソースに逼迫した環境でもありません。 アプリを作成しているのでiPhone、Swift4になります。 一般的にはどちらを選択する方が多いのでしょうか? ビルドして検証してみて「負荷がなければ毎度処理で良い」で判断するものなのでしょうか? 他の処理でその変数を参照することがない、且つ、CPU負荷時間よりも一般的にメモリ参照時間がボトルネックになるならば、毎度処理が良いものなのでしょうか? ご教授頂けると幸いです。 何卒よろしくお願い致します。 解決 短いお返事 ハードリソースに逼迫した環境でないなら、 まずは簡単に作れる、きれいな書き方をしましょう。 リソース(CPU負荷,メモリ,ネットワーク等)が実際に問題になったら、 全体をプロファイラによって計測し、最適化を考えましょう。 コードをきれいに書くことで、結果として最適化をすばやく効果的に行う事ができるでしょう。 考え方を含めたお返事 パレートの法則といわれる経験則があります。 これは、全体のたった1%〜25%程度のプログラムが、 処理時間のうち75〜99%の間働いているという現象です。 同じように、全体のたった1〜25%程度のプログラムが、 メモリのうち75〜99%を使用してしまうという現象もあります。 ここからわかることは、1つ1つのコードで、 CPUのため、またはメモリのために良くなるような形で プログラムを書くことを思い悩んだとしても 少なくともその3/4は、ほとんど無意味になってしまう……ということです。 また「早すぎる最適化」という言葉があります。 これはコードに対する高速化を早すぎるタイミングで行うことで 結果としてコードを複雑化させてしまい、より大きな視点で考えたとき 逆の最適化(不最適化)になってしまう事を言います。 つまりプログラムを後で書き換えやすい単純な形で書かなかったことで 本当に一番問題になるプログラム「1%のコード」が見つかった時に、 そこを書き換えることがなかなかできなくなっていて、 良い結果が得られないということです。 普段のコードではCPUやメモリのことを、どちらも気にせずに 「とりあえず単純でわかりやすく、かつ作ってしまいやすい書き方」でやってしまうほうが、 結果として最適化にもつながります。 結論として 簡単だと感じる書き方 にしてしまいましょう。そして測り、改善しましょう。 回答者: Anonymous

deallocate()でエラーが出てバッファを解放できない

投稿者: Anonymous ■環境 Mac/High Sierra 10.13.6/swift4.2/xcode 10.0 iosアプリで音を取得して解析することを繰り返すアプリを作成しようと思い、 https://qiita.com/a_jike/items/68dd13879f9df5b2b7a2 上記urlサイトを参考にさせていただきました。 そこのサイトに著者のGitHub上のコードが公開されておりました。下記のURLです。 https://github.com/atsushijike/AudioService そこでこのソースの動作確認をしようとしたのですが、 AudioServiceクラスのdeinit内にリソース解放のための buffer.deallocate()が記述されています。 deinit{ buffer.deallocate() } しかし、動かしてみると error for object 0x11a94f000: pointer being freed was not allocated というメッセージが出ました。 試しにbuffer.deallocate()を消してみると通りましたが、bufferが解放されていないのでは無いかと思います。 しっかりと解放する方法を知りたいのですが、調べてもなかなか見つけることができませんでした。 解決のためご助言賜りたいです。 解決 コードの中身を見る限り、NSDataやNSMutableDataを多用していて、とてもSwift的に綺麗なコードとは言えないですね。著者に届かないところでケチをつけてもしかたないことなんで、これ以上は控えますが。 問題のエラーは解放済みの領域を再度解放(二重解放)しようとした時に表示されるものです。解放し過ぎなんですから、条件によってはbuffer.deallocate()を削除することで解消できる可能性がありますが、別の条件ではご心配いただいているように領域の解放漏れでメモリリークが生じる可能性があります。 一番問題なのは、この行です。 AudioService.swift: 92行: data = NSData(bytesNoCopy: buffer, length: Int(maxPacketCount * bytesPerPacket)) NSData.init(bytesNoCopy:length:)と言うイニシャライザはbufferの所有権を引き継ぐ、つまり、bufferの解放はNSDataの側が行うので、これを一度呼び出したら、bufferを割り当てた側がその領域を解放する処理を呼び出してはいけません。 init(bytesNoCopy:length:) Declaration init(bytesNoCopy bytes: UnsafeMutableRawPointer, length: Int)…(Continue Reading)

SceneKitで作成した、立方体ジオメトリの各面タップ時に別々に画面遷移させたい!

投稿者: Anonymous プログラミング初心者で、swiftで開発を始めた者です。 SceneKitを使い、ジェスチャーで回転可能な、立方体のジオメトリを作成しました。 次に、この立方体の各面をタップした時に別のViewControllerに画面遷移させたいのですが、方法が分からず、困っています。 import UIKit import SceneKit class KuruKuruViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let scene = GameScene() //適用するsceneを設定する // SCNView 設定 let scnView = self.view as! SCNView scnView.backgroundColor = UIColor.black scnView.scene = scene scnView.showsStatistics = true scnView.allowsCameraControl = true // CUBEジオメトリ let CUBE:SCNGeometry = SCNBox(width: 3, height: 3, length: 3,…(Continue Reading)

バッファの先頭アドレスを変更したい(データを追加した分先頭を削除したい)

投稿者: Anonymous ■環境 Mac/High Sierra 10.13.6/swift4.2/xcode 10.0 iosアプリで音を取得して解析することを繰り返すアプリを作成しようと思い、 https://qiita.com/a_jike/items/68dd13879f9df5b2b7a2 上記urlサイトを参考にさせていただきました。 そこのサイトに著者のGitHub上のコードが公開されておりました。下記のURLです。 https://github.com/atsushijike/AudioService 上記ソースコードのwritePackets(inBuffer: AudioQueueBufferRef)関数の中で、バッファのコピーがおこなわれていますが、そこでmaxPacketCountよりstartingPacketCount+numPacketsが大きい場合に、書き込んだら溢れてしまう n = startingPacketCount+numPackets-maxPacketCount の数だけ先頭要素を削除し、後ろに要素を新たにn個要素を追加したうえで書き込みを行いたいです。 録音がずっと止まらないようにバッファ不足分だけ先頭をずらして後ろに足していくイメージです。大枠としての案は下記の2点かと思うのですが、その方法がわからず質問致しました。 ■案1 直接バッファの先頭を削除し、後ろに削除した分の要素を追加する 何かの関数でバッファの特定部分を削除し、追加したい分だけ結合する? 配列のイメージで書くと以下のようになります バッファの削除したい先頭の要素数がnの時 for _ in 0 ..< n{ b1.removeFirst() b1.append(書き込みたいデータ) } ■案2 バッファb2を用意し、元のバッファb1から先頭の不要部分を除いたところを先に書き込み、 今回書き込みたい分をb2に追加してからb2をb1にコピー 配列のイメージで書くと以下のようになります バッファの削除したい先頭の要素数がnの時 for i in n ..< b1.count{ b2[i-n] = b1[i] } for i in b1.count-n ..< b1.count{ b2[i]…(Continue Reading)

UIviewを内包した配列においてframeのx,yについて昇順で並び替える方法

投稿者: Anonymous swift4でUIviewを内包した配列においてframeのx,yについて昇順で並び替える方法はどうすればよいでしょうか viewcontrollerにおいて var array = [UIView]() func viewDidLoad() { for i in 0…8 { for n in 0…4 { let view = UIView(frame:CGRect(x: 3 * n, y: 3* i, width: 10, height: 10) view.tag = (Int(i) + 1) * 10 + (1 * Int(n) + 1) self.array.append(view) self.view.addSubview(view) } } } というコードを書いた後に self.array[4].frame…(Continue Reading)

Static Cellの扱い方について、説明通りに操作したのにエラーが出てしまう

投稿者: Anonymous こちらを参考にTalbeViewControllerを配置しコネクトしたのですが、 このように三つほどエラーが出てしまいこれ以上先に進めません コネクションを全て断つとStatic table views are only valid when embedded in UITablelViewController instancesというエラーを残しそれ以外は消滅するのですが、どうしても全てのエラーを消し切ることができません。 ソースコードはこのようになっています。 // // yogo.swift // Senkyo // // Created by student on 2018/11/01. // Copyright © 2018年 *****. All rights reserved. // import UIKit import Foundation class yogo: UIViewController, UITableViewDelegate, UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) ->…(Continue Reading)

swiftで数値をKeyにもつJSONデータをパース

投稿者: Anonymous swift4を使い、以下で公開されているAPIを使ってJSONを取得しました しかしKeyが数値で返されるのでどうやってパースしたら良いかわかりません。 https://cryptowatch.jp/docs/api 取得できるJSONデータの形式 { “result”: { “60”: [ [1481634360, 782.14, 782.14, 781.13, 781.13, 1.92525], [1481634420, 782.02, 782.06, 781.94, 781.98, 2.37578], [1481634480, 781.39, 781.94, 781.15, 781.94, 1.68882] ] } } ここで欲しいのはkey”60”以下のデータなのですが、どのように取り出せば良いのでしょうか? 解決 「数値をKeyに持つ」とは言っても、正しく引用符で囲まれていますから正当なJSONデータということになります。JSONSerializationでも、Swift 4から登場したCodableでも読み込むことはできますが、タグでswift4が指定されていることでもあり、ここではCodableを使った例を示しておきます。 「自分でここまではやったのだが、この部分がうまくできない」と言うのを(動かないコードでも良いので)コードを示して質問されると、より的確な回答をより早く得ることにつながります。今後ご質問を書かれる際にはご留意ください。 さて、リンク先に挙げられたAPIの解説によると、キーになりうる値は限られているようです。 All periods supported: Value Label —— —– 60 1m 180 3m 300 5m 900 15m 1800 30m…(Continue Reading)

SpriteKitにおいてキーボード入力を同時に2つ以上受け付ける方法を知りたい

投稿者: Anonymous spritekitを用いたMac向けのアプリでキーボードの同時入力を処理したい こちらの質問に関係する話になりますので、ご参照ください。 一度は解決した問題でしたが、ここで困ったことが起こりました。 これでは確かに数値を単純にいじるだけであれば問題ないのですが、WASD移動に加えて左シフトのホールドによるスニーク(低速移動)を実装しようとした時に動作しないことは自明です。 どのようにすれば2つ以上のキーが押されている状態であるかを取得することができるのでしょうか 解決 macOS 10.12 以降のみサポートで良いならkeyDown(with: theEvent)とkeyUp(with: theEvent)を以下のように修正することで可能かと思います。 shiftで減速、controlで加速を想定しています 同時押しによる衝突を避けるため、shiftが押されていないときのみcontrolが押されているか?の判断をしています private let DefaultSpeed: Int = 10 private let SpeedUpRate: Float = 2.0 private let SlowDownRate: Float = 0.5 override func keyDown (with event: NSEvent) { let accelarateRate: Float = checkAccelarateRate(for: event) switch event.keyCode { case 13: distanceX = DefaultSpeed *…(Continue Reading)

Swift UITableViewにて、前画面にて選択されたデータの取得

投稿者: Anonymous はじめまして。プログラミング初心者です。初めての投稿です。 SwiftにてUiTableViewを用いている場合のデータの取得に関する質問です。 すこし説明しにくいので、実例を用いてみます。 iPhoneのカレンダーのアプリにて新しいイベントを作成するページにある機能なのですが、イベントの繰り返しを変更する際に、ディフォルトのNeverをタップすると新しいページが開きます。 そのぺージにて選択を変更すると、選択されたセルのデータが次のページにて表示されます。 これはどのように設定すればよいのでしょうか。 セグエでもなさそうですし、セルにはUILabelではなく UItextviewを用いるのではと思いますが、どのようにデータを扱うのかよくわかりません。 また、選択したセルのデータをどのように取得し、どのタイミングで最初のページに転送しているのかも不明です。 以下にてスクリーンショットを添付します。 サンプルのコードを頂ければ助かります。 お手数ですが、よろしくお願いします。 解決 こんばんは。Qiita でもコメントさせていただいた者です。 さて、この タップすると新しいページが開きます。そのぺージにて選択を変更すると、選択されたセルのデータが次のページにて表示されます。 というのは、「画面遷移した先でデータを選択し、遷移元の表示も変える」と言い表すことができるでしょう。 では、遷移元を MainTableViewController 、遷移先を DetailTableViewController としてサンプルを示します(画像ではなく文章を書き連ねています…)。 どちらも UITableViewController を継承しています。 MainTableViewController.swift import UIKit class MainTableViewController: UITableViewController { var detailText = “初期値” override func viewDidLoad() { super.viewDidLoad() } override func viewWillAppear(_ animated: Bool) { self.tableView.reloadData() super.viewWillAppear(animated) } //…(Continue Reading)

ViewControllerのPresentationがOverCurrentContexだと元のViewContorollerに戻った時にviewWillAppearが呼び出されない

投稿者: Anonymous Xcode10.0 swiftで、ViewControllerに、別のViewControllerをポップアップウインドウのようにように表示しています。 別のViewControllerからはdismiss(animated: true, completion: nil)で元のViewContorollerで戻っています。 別のViewControllerのPresentationがFullScreenだと元のViewControllerのviewWillAppearが呼び出されます 別のViewControllerのPresentationがOverCurrentContextだと元のViewControllerのviewWillAppearが呼び出されません viewWillAppearが呼び出されない理屈はわかりますが、PresentationがOverCurrentContextでもviewWillAppearを呼び出す方法をどちらかご教授ください。 解決 UIViewControllerのbeginAppearanceTransition(_:animated:)とendAppearanceTransition()を呼ぶことで、ビューコントローラの表示非表示が変わったことを伝えることができます。 本来はコンテナビューコントローラから内包する子のコントローラにライフサイクルを伝播させるためのメソッドですが、方向が逆になるだけで本来の使い方と同等なのでワークアラウンドとしては妥当なところでしょう。 仮に、単にpresent(_:animated:completion:)メソッドでビューコントローラを表示しているだけなら、表示される側のビューコントローラの各ライフサイクルメソッドの中で次のような順序でこのメソッドを呼び出せば、modalPresentationStyle = .fullScreenの場合と同じ結果が得られます。 トランジションをカスタマイズしている場合は、トランジションの開始と終了の時点で適切にこれらのメソッドを呼び出します。 class ViewController2: UIViewController { override func viewWillAppear(_ animated: Bool) { presentingViewController?.beginAppearanceTransition(false, animated: animated) super.viewWillAppear(animated) } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) presentingViewController?.endAppearanceTransition() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) presentingViewController?.beginAppearanceTransition(true, animated: animated) presentingViewController?.endAppearanceTransition() } override…(Continue Reading)

UIButtonのaddTargetがうまくいかない

投稿者: Anonymous 環境:Mac/High Sierra 10.13.6/swift4.2/xcode 10.0 下記コードでUIButtonをaddSubviewした時に、うまく動きません。 ViewController上でUIButtonを直接定義するとうまく動くことが確認できました。 また、BulbSwitchButtonクラス内のイニシャライザでViewControllerを引数で指定して、プロパティに追加(weak var vc:ViewController)すればうまくいくことも確認しました。 ただ、下記コードのようにViewController上で、他クラスのUIButtonプロパティをaddSubview()した時に、クリックしてもBulbSwitchButtonクラスのaction()が動作しない理由がわかりませんでした。 ViewController.swift import UIKit class ViewController: UIViewController { override func viewDidLoad() { Logger.debug(Logger.Message.START_FUNCTION.rawValue) super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. var bulb = Bulb(id: 1, state: true) var bulbSwitch = BulbSwitchButton(bulb: bulb) bulbSwitch.button.frame = CGRect(x: 0, y:…(Continue Reading)

SKShapeNodeクラスで円を描きたいが、initでエラー

投稿者: Anonymous プレイヤーから放つ弾を作りたくて SKShapeNode クラスを使って円を作りたいのですが、エラーが出てしまいます。読む限り、このクラス用に作られたものを指定しろと言われているようなのですが、使いたてでなにぶんわかりません。 とても短いですがこのようなコードになっています。 import Foundation import UIKit import SpriteKit class Shooter: SKShapeNode { init() { super.init(circleOfRadius: 5) } required init?(coder aDecoder: NSCoder) { fatalError(“init(coder:) has not been implemented”) } } そして、エラーの内容は Must call a designated initializer of the superclass ‘SKShapeNode’ となっています。私は一体何を指定してあげれば良いのでしょうか、ご回答よろしくお願いします。 解決 別回答者さんから、クラスの継承についてと、イニシアライザに関する解説がありましたが、ここでは実践的に「じゃあどう書き直せばいいの?」な話をしたいと思います。 まず、サブクラスShooterは、親クラスの指定イニシアライザ(Designated Initializer。別回答者さんは「指名イニシアライザ」と訳しています)を上書き(とくに意図がない場合は、同時に継承(Delegate)も)します。イニシアライザには、指定イニシアライザと簡便イニシアライザ(Convenience Initializer。別回答者さんの訳では「利便イニシアライザ」)の2種類がありますが、リファレンス上では、指示子がないのが指定イニシアライザ、convenience指示子があるのが、簡便イニシアライザです。 SKShapeNodeのリファレンスには、簡便イニシアライザしかありませんが、親クラスのSKNodeにある指定イニシアライザが、そのままSKShapeNpdeの指定イニシアライザとなります。init()とinit?(coder aDecoder: NSCoder)の二つがあります。 class Shooter: SKShapeNode…(Continue Reading)

swift2からswift4へのコンバートエラーについて

投稿者: Anonymous dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { let icloudURL = self.makeICloudURL(“test.txt”) dispatch_async(dispatch_get_main_queue(), { if icloudURL != nil { self.writeICloud1(icloudURL!) } else { self.showAlert(“エラー”, text: “iCloudのURLの取得に失敗”) } }) }) 上記構文ではエラーになり 下記構文にしていますがエラーが取れない状況です。 DispatchQueue.global(qos: .default).async { let icloudURL = self.makeICloudURL(fileName: “test.txt”) dispatch_async(dispatch_get_main_queue(), { if icloudURL != nil { self.writeICloud1(icloudURL!) } else { self.showAlert(“エラー”, text: “iCloudのURLの取得に失敗”) } }) } エラー解除の構文を教えて戴けませんか。…(Continue Reading)

UITableViewの中にUICollectionViewを入れたいのですが、エラーがでてできません

投稿者: Anonymous UITableVIewの中にUICollectionViewを入れたいのですが、 Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘UICollectionView must be initialized with a non-nil layout parameter’ とエラーがでます。なぜでしょうか、また解決策はなんでしょうか。 ご教授お願い致します。 現在のコード(全てコードで書いています) TableViewCell let width = UIScreen.main.bounds.width let height = UIScreen.main.bounds.height class TableCell: UITableViewCell { var collection = UICollectionView() override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) self.setup() } required init?(coder: NSCoder)…(Continue Reading)

①の画面でcollectionViewで一覧を表示—> ②選択された画面を削除して①へ戻る時に削除した画面も表示されます。①の画面を最初から処理する方法を教えて戴けませんか?

投稿者: Anonymous ①の画面でcollectionViewで一覧を表示—> ②選択された画面を削除して①へ戻る時に削除した画面も表示されます。①の画面を最初から処理する方法を教えて戴けませんか? ①と②の画面をsegueでつなぎました。 戻るsegueは上手くいかなかったので接続してみましたが、AppDelegateでエラーになり上手くいきません。 ②から戻る時 self.performSegue(withIdentifier: “backSubViewController”,sender: nil) —– この処理の後,delegateエラーになります。 // Segue 準備 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { let subVC: SubViewController = (segue.destination as?SubSubViewController)! subVC.selectedNo = “eart } 解決 segueで次の画面に遷移しているならば、戻るボタンを押したときに dismissViewControllerAnimated(true, completion: nil) の1行を呼び出せば戻れると思います。 改めてSegueで遷移する必要はありません。 回答者: Anonymous

swiftのtableviewのdequeueReusableCellの再利用とは

投稿者: Anonymous SwiftのUITableviewでdequeueReusableCellというメソッドがあります。 本などには再利用可能なセルを取得とありますが、何の再利用なのでしょうか? インスタンス化されたセルなのか、なんなのかわからず。 使う分には気にしなくてもいいと思いますが、内容をきちんと理解しておきたく、ご存知の方ご教示お願いします。 解決 「インスタンス化されたセル」です。 と結論だけではあまりにもあれなんで、もう少し補足を。 この動作を理解するためには、「UIViewのインスタンス化は意外と重い」ということを意識しておかないといけません。 UIView UIViewなり、そのサブクラスであるUITableViewCellにちょっとした構造(storyboardでデザインするような、色々なコントロールや子viewが貼り付けられた階層構造)がある場合、そのインスタンス化は「iOS的には割と重い処理」になります。 UIViewは上記した「view間の階層構造を保持する」機能以外に、制約でそれらの位置関係を動的に維持・管理する機能、アニメーションや変形のサポートとそのためのlayerや、描画結果のキャッシュ管理、イベント処理などなど、非常に多彩な処理を内部的に行なっており、インスタンス化するだけでもちょっとした負荷になる事柄なのです。 UITableViewなんかでは、ユーザが画面をひたすらスクロールする、なんてことは非常によく見られる操作であり、それがもたつくとユーザは非常にイライラするものです。(この際、tableView(:cellForRowAt:)が繰り返し呼ばれます。)iOSでは、その場合のレスポンスを少しでも改善するため、インスタンス化の手間だけでもできるだけ減らそうとしているわけです。 正直、今日のハイエンドのiPhoneなんかを使って開発していると、dequeueReusableCellを使わずに「毎回イニシャライザを呼んでいる」ようなコードを書いても、簡単には差が感じられなくなってきています。ただ、ちょっと難しいテストをすれば十分わかる程度の差がつきますし、お約束を守れば良いだけなので、今後も「tableView(:cellForRowAt:)を実装する際には必ずdequeueReusableCellを使うべき」という推奨パターンは変わらないだろうと思います。 回答者: Anonymous