- 1. 【SwiftUI】Viewコンポーネントの抽象化について考える
- 2. 【SwiftUi】StateObjectとObservedObjectの違い
- 3. SwiftUI Buttonタップ時にハイライトをさせないようにしたい
- 4. イカリング3をPCブラウザで表示する
- 5. WebKitのiOSビルドにlldbがattachできないときの解決方法
- 6. iPhoneの共有シートを使ってSafariからScrapboxに投稿する
- 7. UIEditMenuInteractionを使ってメニューを出してみた
- 8. 【Swift】CodableをCamelCaseで定義する方法
- 9. iOSDC 2022セッション資料まとめ
- 10. iOSDC Japan 2022 day0 前夜祭で視聴したセッションとその感想
- 11. 楽器チューナをiPhoneで作ってみる
- 12. Swift Playgrounds App
- 13. 【Flutter】tutorial_coach_mark の使い方
- 14. 【Swift】コードでアラートを閉じる
- 15. 【Xcode】正規表現を使用して一括置換
- 16. [Fllutter]iOSエミュレーターで実行できなくなった
- 17. FlutterでiOSのselectionHandleColorを設定する方法
- 18. Swift Playgrounds のアプリに plist ファイルを適応して機能を追加する
- 19. App Groups で共有したファイルを監視してプロセス間の変更を Combine で検知する
- 20. 【Swift】文字列を比較する
【SwiftUI】Viewコンポーネントの抽象化について考える
# はじめに
[SARAH iOSアプリケーション](https://apps.apple.com/jp/app/id916083595)へのSwiftUI導入が進む中で、Viewコンポーネントの抽象度についてベストプラクティスを考える機会が多々あります。例えばボタンを一つ作るにしても、「背景色は外から自由に指定可能にするべきか?じゃあフォントサイズは?」といった具合に「どこまでやる?」がつきまといます。
そんなViewコンポーネントの抽象化を、SwiftUIの特性を活かしつつ深ぼっていこうと思います。# 今回の題材
SARAHアプリには飲食店のメニューを一皿単位で検索できる画面があり、テキストだけでなく各種タグを選んで検索ができます。今回はそのタグ選択フォーム(以降**ファセット
【SwiftUi】StateObjectとObservedObjectの違い
# はじめに
`ObservedObject`を用いたページにおいて、その上位ページの値がeventlistenerによって変化する度に現在のページが初期化されることがあった。
ViewModelからデータを共有する方法は大きく`StateObject`と`ObvservedObject`の2つがある。
よってこの2つの使い方や特徴をまとめる。# 環境
Xcode 13.3.1# 構成
APP
| Mainview.swift
\ーchildrenPages
| ObservedObjectView.swift
| StateObjectView.swift# Code
“`swift: MainView
class MainViewModel: ObservableObject {
@Published var mainCount = 0
}struct MaintView: View {
@ObservedObject var viewmodel = MainViewModel()
var bo
SwiftUI Buttonタップ時にハイライトをさせないようにしたい
configuration.labelだけのButtonStyleを作り
“`swift
struct NotHighlightButtonStyle: ButtonStyle {
func makeBody(configuration: Configuration) -> some View {
configuration.label
}
}
“`buttonStyleに定義すればボタンタップ時にハイライトしないようにできる。
“`swift
struct ContentView: View {
var body: some View {
Button {
print(“tap!”)
} label: {
//~~省略
}.buttonStyle(NotHighlightButtonStyle())
}
}
“`
終
イカリング3をPCブラウザで表示する
# はじめに
こちらの記事([イカリング2をPCブラウザで見れる方法があるらしいのでやってみた](https://qiita.com/valmet/items/1b3960085a8764778bf0))を参考にイカリング2をPCブラウザで閲覧していたが、Splatoon3の発売に際してイカリング3も同様に閲覧出来ないか試したところ、一応上手く行ったので、備忘録も兼ねて手順を簡単に記載します。※当記事は、上記記事を参考・ベースに書かせて頂きました。
# 環境
– PC
– Ubuntu 20.04– スマートフォン
– iPhone 12 mini
– iOS 15.6– プロキシツール
– [mitmproxy](https://mitmproxy.org/)– ブラウザ
– Google chrome– cookie管理ソフト
– [EditThisCookie](https://chrome.google.com/webstore/detail/editthiscookie/fn
WebKitのiOSビルドにlldbがattachできないときの解決方法
初めてQiitaに記事を投稿してみました。いろいろ未熟ではありますが、結構ニッチな部分の記事なので、誰かの役に立てたらいいな、と思い少し記事を書かせていただきました。よろしくお願いします。
# TL;DR
iOS用のWebKitにデバッガーがattachできない問題は、権限の問題です。
まず
“`
$ sudo DevToolsSecurity -enable
“`を実行したあと、リカバリーモードでブートして、コンソールで以下の命令を実行しましょう。
“`
$ csrutil enable –without debug
“`# 問題編
私はあるWebKitのバグを再現し、デバッガーでログをみようとしていました。
このバグはiOSでしか再現ができないバグで、私はWebKitの公式ページを頼りにiOSのデバッグビルドを作成してログを確認しようとしました。
https://webkit.org/building-webkit/
https://webkit.org/running-webkit/
https://webkit.org/debugging-
iPhoneの共有シートを使ってSafariからScrapboxに投稿する
## 前提
– タイトルにページ名を、本文にページURLを設定した画像を貼るというのが基本機能
– ただしレシピの管理用に作成したため、それに即した機能になっている## 使ったもの
– ショートカットApp (iOS15.6)
– [Scrapboxへのリンクを生成してアクセスするとページが作られる機能](https://scrapbox.io/help-jp/%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%9C%E3%82%8B#58ae7de497c29100005b8874)## デモ
![レシピクリップ_AdobeExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547010/d7044605-af34-ab60-990d-1cb3144eb61b.gif)## 処理
### 概要
1. 共有シートからの入力を受け付ける
1. 画像を取得
1. タイトルを取得
1. 本文を取得
1. URLを作成し開く
### 1. 共有シートからの
UIEditMenuInteractionを使ってメニューを出してみた
## そもそもメニューってなんのこと?
今回はiOSの話に限りますが、テキストなどの文字列を長押ししたり
タップすると、画像のようにコピーや貼り付けできるメニューが表示されます。![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945342/97d0e6d6-1b65-b16b-2f5b-03138eb54694.png)
## iOS16で今まで記載していたメニュー表記のライブラリが非推奨に・・・
現在まではメニュー表示やこのメニュー欄をカスタマイズする方法は、
「UIMenuController」を使用していました。しかしiOS16ではこのライブラリが非推奨となり、
新たに「UIEditMenuInteraction」を使用することが
推奨されています。今回はSwiftでメニューを試しに表示する方法を
簡単に説明しようかと思います!## 早速コードを書いてみよう!
### ①まずは適当なUIを用意!
ここではコピーしたい任意の文字列を置きます。
Classは「UI
【Swift】CodableをCamelCaseで定義する方法
# サンプルデータ
Twitterの[users/show](https://developer.twitter.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-users-show)を一部抜粋してサンプルデータにしました“`sample.json
{
“id”: 121314463,
“id_str”: “121314463”,
“name”: “サンプル”,
“screen_name”: “sample”,
“location”: “japan”,
“description”: “sample”
}
“`# 方法1(CodingKeysを使う)
“`swift:SampleModel
import Foundationstruct SampleModel: Codable {
let id: Int
let idStr, name, screenName, locatio
iOSDC 2022セッション資料まとめ
![iosdc.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/26d7a61f-d285-00b0-4dde-f1524427fae8.png)
iOSDC2022登壇資料、スライドのまとめです。
Twitter等で見つけ次第掲載しますが、もし資料を見かけた方or資料を公開した登壇者の方がいらっしゃいましたら、コメント等でお声がけください。
スライドや資料のリンクが見つかった場合はタイトルにリンクをつけてありますので、タイトルがリンクになっていない場合はまだ資料が見つかっていないものになります。# Day 0
## Track A
### [ノートアプリのテキストエディタの解体新書](https://www.docswell.com/s/fromkk/K1NDRZ-note_ios_text_editor)
[forteeのリンク](https://fort
iOSDC Japan 2022 day0 前夜祭で視聴したセッションとその感想
# はじめに
今年もiOSDC Japanに参加しているので、私が視聴したセッションとその感想をまとめました。day0 前夜祭のセッションになります。**iOSDC Japan 2022**については[こちら](https://iosdc.jp/2022/)をご覧ください。
# ノートアプリのテキストエディタの解体新書
最初に参加したセッションはこちらでした。noteアプリのテキストエディタに関するセッションです。私はnoteをよく使っており、昨年のアクセシビリティに関するセッションも面白かったので、今年も楽しみにしていました。UITextViewを複数配置することで、拡張性高く機能追加に柔軟に対応可能できるというお話が印象的でした。また、iPadのレイアウト用に[readableContentGuide](https://developer.apple.com/documentation/uikit/uiview/1622644-readablecontentguide)を使用しているというお話も非常に参考になりました。
普段何気なく使っているnoteアプリのエディタの裏
楽器チューナをiPhoneで作ってみる
## はじめに
興味はあるもののなかなか手出しできなかったiPhoneのAudioプログラミングに挑戦してみました。
題材は、マイクからのオーディオ取得とFFTを使った楽器(主にギター?)チューナです。楽器チューナは、下図のようにマイクから音を取り込み、FFTで周波数軸のデータを取り出し、所定の周波数と合致しているかを判定することで、おおよその機能が実現します。
“`mermaid
sequenceDiagram
participant A as 楽器(ギターなど)
participant B as 楽器チューナ(iPhone)A->>B: ♬
B->>B: マイクで楽器音を取得
B->>B: FFT演算
B->>B: 周波数比較alt 周波数が一致した
B->>B: 表示
end
“`## 技術要素
### マイク入力の音声データを取得する
マイク入力のための資料は、あるようで実は絶望的に少なかったです。
Appleの資料だけでは、何をどう組み立てれば良いのか、ほぼ暗中模索状態
Swift Playgrounds App
2021年から、iPadのSwift Playgroundsアプリを使ってiOSアプリの開発ができるようになりました。この際、従来のやり方であるXcodeを使ったiOSアプリの開発とは異なる、新しいプロジェクト形式が使われます。
この新しいプロジェクト形式は、従来の形式にあった問題点を解消していて興味深いです。本記事では、この新しいプロジェクト形式がどのようなものなのか見ていきます。
## Xcodeプロジェクト形式
まず、従来のプロジェクト形式について確認しましょう。ここでは、「Xcodeプロジェクト形式」と呼ぶことにします。
XcodeでiOS Appを新規作成すると、`.xcodeproj` という拡張子のバンドル(フォルダ)ができます。xcodeprojバンドルの中に `project.pbxproj` というファイルがあり、これにプロジェクトの情報が保存されます。
“`shellsession:Xcodeプロジェクト形式の構成ファイル(一部省略)
XcodeAppSample/
├── XcodeAppSample/
│ ├── ContentView.swi
【Flutter】tutorial_coach_mark の使い方
## 初めに
tutorial_coach_mark とは、以下のように、特定の Widget にフォーカスして、ユーザにアプリの操作方法を理解してもらうためのチュートリアルを作成するパッケージです。
[公式ページ](https://pub.dev/packages/tutorial_coach_mark)から引用## 記事の対象者
+ アプリにチュートリアルを実装したい方
+ 操作が難しいアプリを開発している方
+ アプリに対して「操作がわかりにくい」とフィードバックがあった方## 準備
### パッケージの追加
まずは[ tutorial_coach_mark パッケージ ](https://pub.dev/packages/tutorial_coach_mark/install)を「 pubspeck.yam
【Swift】コードでアラートを閉じる
# はじめに
たぶん普通の事なんだと思いますが、初心者すぎて悩んだので記録しておきます。# 実装
ボタンでアラートを表示して、アプリがバックグラウンドになったらアラートを閉じます。
“`swift
import UIKitclass ViewController: UIViewController {
private var alert: UIAlertController!
override func viewDidLoad() {
super.viewDidLoad()// バックグラウンド監視
NotificationCenter.default.addObserver(
self,
selector: #selector(background),
name: UIApplication.willEnterForegroundNotification,
object: nil
)
【Xcode】正規表現を使用して一括置換
# はじめに
Xcodeの検索機能や置換機能はよく使うと思います。
置換を正規表現使ってやりたいと思ったときにやり方に迷ったので記録しておきます。# やり方
① `⌘ + F`で検索欄を表示させます
![スクリーンショット 2022-09-09 1.07.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/de242ca9-1280-1fd6-4067-223aeeac9d70.png)② Findの右にある矢印を押します
![スクリーンショット 2022-09-09 1.09.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/4a830658-a1fb-02c9-6c71-830392ca856c.png)③ 「Replace」を選択します
![スクリーンショット 2022-09-09 1.10.47.png](https://qiita-image-store.s3.ap
[Fllutter]iOSエミュレーターで実行できなくなった
# 実行できるようになります。
## 出たエラー
“`
Launching lib/main.dart on iPhone 13 Pro Max in debug mode…
Running pod install…
Running Xcode build…
Xcode build done. 8.2s
Failed to build iOS app
Error output from Xcode build:
↳
2022-09-09 18:26:27.927 xcodebuild[69619:651609] Requested but did not find extension point with identifier Xcode.IDEKit.ExtensionSentinelHostApplications for extension Xcode.DebuggerFoundation.AppExtensionHosts.watchOS of plug-in com.a
FlutterでiOSのselectionHandleColorを設定する方法
## 概要
iOSにおいて、テキスト選択時のハンドルカラーを`textSelectionTheme`で変更することができず、つまずいたので方法を紹介します。## Androidの場合
テキスト選択時の設定は全て`textSelectionTheme`で設定できます。
“`dart
ThemeData(
// …省略…
textSelectionTheme: TextSelectionThemeData(
selectionColor: selectionColor,
cursorColor: cursorColor,
selectionHandleColor: selectionHandleColor
Swift Playgrounds のアプリに plist ファイルを適応して機能を追加する
# 初めに
まず最初に **Xcode の Playground とは違います** のでmm
今回は **Swift Playgrounds** でアプリを開発する場合のお話です。## Swift Playgrounds とは
2016年に登場した iPad 上で Swift を学習できるアプリです。
https://www.apple.com/jp/swift/playgrounds/
当初はテンプレートの教材を Swift で学習するだけでした。
現在はバージョンが`4.1`までリリースされており、iPad のみならず Mac 上でも動作し、**実際にリリースできるアプリが作成できる**までになりました。
## どんなことができるの?
iOSDC Japan 2022 で LT をします!
https://fortee.jp/iosdc-japan-2022/proposal/cc685572-46e9-483a-83b2-a1c839662dec
登壇後に資料をあげるので、見ていただけると少しは理解が深まるかと思いますmm
# plist ファイルに
App Groups で共有したファイルを監視してプロセス間の変更を Combine で検知する
## 背景
### App Groups とプロセス間通信
https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_application-groups
> App groups allow multiple apps produced by a single development team to access shared containers and communicate using interprocess communication (IPC).
App Groups は複数のアプリケーションが同じ領域にアクセスできるようにする仕組みです。異なるアプリケーションは別のプロセスで動いて
【Swift】文字列を比較する
# はじめに
文字列を比較する方法を学んだので記録しておきます。# 使い方
“`swift
import Foundation
let A = “123”let B = “456”
let compare = A.compare(B, options: .numeric)
switch compare {
case .orderedAscending:
print(“Aの方が小さいです”)
case .orderedDescending:
print(“Aの方が大きいです”)
case .orderedSame:
print(“AとBは同じです”)
}
“`# 解説
数字と数字の比較ならわかりやすいですね
しかし、`compare`は数字以外も比較できます。なぜ数字以外が比較できるのでしょうか
どのようなルールで比較してるのでしょうかこれは文字列の順序が上か下か同じかを判定しているものであると思います。
よって、数字とひらがなであっても比較できます。
“`
数字 < アルファベット(大) < アルファベット(小) < ひらがな