delphi 10.1 berlin 开发iOS程序偏好设置(Settings Bundle)

1、做一个Root.plist 文件,文件格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>StringsTable</key>
<string>Root</string>
<key>Title</key>
<string></string>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Type</key>
<string>PSTextFieldSpecifier</string>
<key>Title</key>
<string>偏好1</string>
<key>Key</key>
<string>param1</string>
<key>KeyboardType</key>
<string>NumberPad</string>
</dict>
<dict>
<key>Type</key>
<string>PSTextFieldSpecifier</string>
<key>Title</key>
<string>偏好2</string>
<key>Key</key>
<string>param2</string>
<key>KeyboardType</key>
<string>Alphabet</string>
</dict>
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string>Group</string>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>偏好3</string>
<key>Key</key>
<string>param3</string>
<key>DefaultValue</key>
<integer>0</integer>
</dict>
</array>
</dict>
</plist>

2、在用delphi 10.1 berlin创建的工程下新建一个文件夹重命名为Settings.bundle,把第一步创建的文件Root.plist 文件拷贝到该文件夹中。

3、点击delphi 10.1 berlin  菜单中 Project --> deployment,在这里填加文件 Root.plist ,Remote Path改为  .\Settings.bundle\    ,编译程序看一下效果吧,这时ios设置里已经能看到该项目生成偏好设置了,等有时间把图片传上来

4、代码实现读取偏好设置,先创建一个单元my.iOS.NSUserDefaults.pas

unit my.iOS.NSUserDefaults;


interface


uses
  System.Classes,
  System.TypInfo,
{$IFDEF IOS}
  iOSapi.Foundation,
  Macapi.ObjectiveC,
  Macapi.ObjCRuntime,
  Macapi.Helpers,
{$ENDIF}
  FMX.StdCtrls;


type
  TMyUserDefaults = class;


  // ------------------------------------------------------------------------------
{$IFDEF IOS}


  IMyNSNotificationCenterHandler = interface(NSObject)
    ['{70CD840A-7F21-4CB6-99F4-EA45EAE2A48C}']
    procedure defaultsChanged(notification: NSNotification); cdecl;
  end;


  // ------------------------------------------------------------------------------
  TMyNSNotificationCenterHandler = class(TOCLocal)
  private
    FMyUserDefaults: TMyUserDefaults;
  protected
    function GetObjectiveCClass: PTypeInfo; override;
  public
    constructor create(ADPFUserDefaults: TMyUserDefaults);
    procedure defaultsChanged(notification: NSNotification); cdecl;
  end;


{$ENDIF}


  TMyUserDefaultsChanged = procedure(sender: TObject) of object;


  [ComponentPlatformsAttribute(PidWin32 or pidiOSDevice32 or pidiOSDevice64 or
    PidiOSSimulator)]
  TMyUserDefaults = class(TComponent)
  private
    FOnUserDefaultsChanged: TMyUserDefaultsChanged;
{$IFDEF IOS}
    FMyNSNotificationCenterHandler: TMyNSNotificationCenterHandler;
{$ENDIF}
  protected
  public
{$IFDEF IOS}
    procedure Loaded; override;


    function GetBooleanValue(key: string): boolean;
    function GetDoubleValue(key: string): double;
    function GetInt64Value(key: string): nativeuint;
    function GetSingleValue(key: string): single;
    function GetStringValue(key: string;
      const DefaultValue: string = ''): string;
    function GetStringArrayValue(key: string): TArray<string>;


    procedure SetBooleanValue(key: string; value: boolean);
    procedure SetDoubleValue(key: string; value: double);
    procedure SetInt64Value(key: string; value: nativeuint);
    procedure SetSingleValue(key: string; value: single);
    procedure SetStringValue(key: string; value: string);
    procedure SetStringArrayValue(key: string; values: TArray<string>);


    function synchronize: boolean;


{$ENDIF}
    constructor create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property OnUserDefaultsChanged: TMyUserDefaultsChanged
      read FOnUserDefaultsChanged write FOnUserDefaultsChanged;
  end;


  // ------------------------------------------------------------------------------
implementation


// ------------------------------------------------------------------------------
{ TMyUserDefaults }
// ------------------------------------------------------------------------------
constructor TMyUserDefaults.create(AOwner: TComponent);
begin
  inherited create(AOwner);
{$IFDEF IOS}
  FMyNSNotificationCenterHandler :=
    TMyNSNotificationCenterHandler.create(Self);
  TNSNotificationCenter.Wrap(TNSNotificationCenter.OCClass.defaultCenter)
    .addObserver(FMyNSNotificationCenterHandler.GetObjectID,
    sel_getUid('defaultsChanged:'),
    (StrToNSStr('NSUserDefaultsDidChangeNotification') as ILocalObject)
    .GetObjectID, nil);
{$ENDIF}
end;


// ------------------------------------------------------------------------------
destructor TMyUserDefaults.Destroy;
begin
{$IFDEF IOS}
  TNSNotificationCenter.Wrap(TNSNotificationCenter.OCClass.defaultCenter)
    .removeObserver(FMyNSNotificationCenterHandler.GetObjectID);
  FMyNSNotificationCenterHandler.DisposeOf;
{$ENDIF}
  inherited;
end;
// ------------------------------------------------------------------------------
{$IFDEF IOS}


procedure TMyUserDefaults.Loaded;
begin
  inherited;
end;


// ------------------------------------------------------------------------------


function TMyUserDefaults.GetBooleanValue(key: string): boolean;
var
  UDefaults: NSUserDefaults;
begin
  Result := False;
  if key = '' then
    exit;
  UDefaults := TNSUserDefaults.Wrap
    (TNSUserDefaults.OCClass.standardUserDefaults);
  Result := UDefaults.boolForKey(StrToNSStr(key));
end;


// ------------------------------------------------------------------------------
function TMyUserDefaults.GetDoubleValue(key: string): double;
var
  UDefaults: NSUserDefaults;
begin
  Result := 0;
  if key = '' then
    exit;
  UDefaults := TNSUserDefaults.Wrap
    (TNSUserDefaults.OCClass.standardUserDefaults);
  Result := UDefaults.doubleForKey(StrToNSStr(key));
end;


// ------------------------------------------------------------------------------
function TMyUserDefaults.GetInt64Value(key: string): nativeuint;
var
  UDefaults: NSUserDefaults;
begin
  Result := 0;
  if key = '' then
    exit;
  UDefaults := TNSUserDefaults.Wrap
    (TNSUserDefaults.OCClass.standardUserDefaults);
  Result := UDefaults.integerForKey(StrToNSStr(key));
end;


// ------------------------------------------------------------------------------
function TMyUserDefaults.GetSingleValue(key: string): single;
var
  UDefaults: NSUserDefaults;
begin
  Result := 0;
  if key = '' then
    exit;
  UDefaults := TNSUserDefaults.Wrap
    (TNSUserDefaults.OCClass.standardUserDefaults);
  Result := UDefaults.floatForKey(StrToNSStr(key));
end;


// ------------------------------------------------------------------------------
function TMyUserDefaults.GetStringValue(key: string;
  const DefaultValue: string = ''): string;
var
  UDefaults: NSUserDefaults;
  nStr: NSString;
begin
  if key = '' then
    exit;
  Result := DefaultValue;
  UDefaults := TNSUserDefaults.Wrap
    (TNSUserDefaults.OCClass.standardUserDefaults);
  nStr := UDefaults.stringForKey(StrToNSStr(key));
  if Assigned(nStr) then
    Result := UTF8ToString(nStr.UTF8String);
end;


// ------------------------------------------------------------------------------
procedure TMyUserDefaults.SetBooleanValue(key: string; value: boolean);
var
  UDefaults: NSUserDefaults;
begin
  if key = '' then
    exit;
  UDefaults := TNSUserDefaults.Wrap
    (TNSUserDefaults.OCClass.standardUserDefaults);
  UDefaults.setBool(value, StrToNSStr(key));
end;


// ------------------------------------------------------------------------------
procedure TMyUserDefaults.SetDoubleValue(key: string; value: double);
var
  UDefaults: NSUserDefaults;
begin
  if key = '' then
    exit;
  UDefaults := TNSUserDefaults.Wrap
    (TNSUserDefaults.OCClass.standardUserDefaults);
  UDefaults.setDouble(value, StrToNSStr(key));
end;


// ------------------------------------------------------------------------------
procedure TMyUserDefaults.SetInt64Value(key: string; value: nativeuint);
var
  UDefaults: NSUserDefaults;
begin
  if key = '' then
    exit;
  UDefaults := TNSUserDefaults.Wrap
    (TNSUserDefaults.OCClass.standardUserDefaults);
  UDefaults.setInteger(value, StrToNSStr(key));
end;


// ------------------------------------------------------------------------------
procedure TMyUserDefaults.SetSingleValue(key: string; value: single);
var
  UDefaults: NSUserDefaults;
begin
  if key = '' then
    exit;


  UDefaults := TNSUserDefaults.Wrap
    (TNSUserDefaults.OCClass.standardUserDefaults);
  UDefaults.setFloat(value, StrToNSStr(key));
end;


// ------------------------------------------------------------------------------
procedure TMyUserDefaults.SetStringArrayValue(key: string;
  values: TArray<string>);
var
  UDefaults: NSUserDefaults;
  vls: NSMutableArray;
  i: Integer;
begin
  if key = '' then
    exit;
  UDefaults := TNSUserDefaults.Wrap
    (TNSUserDefaults.OCClass.standardUserDefaults);


  vls := TNSMutableArray.create;
  for i := 0 to high(values) do
    vls.addObject((StrToNSStr(values[i]) as ILocalObject).GetObjectID);


  UDefaults.setObject((vls as ILocalObject).GetObjectID, StrToNSStr(key));
  vls.release;
end;


// ------------------------------------------------------------------------------
procedure TMyUserDefaults.SetStringValue(key, value: string);
var
  UDefaults: NSUserDefaults;
begin
  if key = '' then
    exit;
  UDefaults := TNSUserDefaults.Wrap
    (TNSUserDefaults.OCClass.standardUserDefaults);
  UDefaults.setObject((StrToNSStr(value) as ILocalObject).GetObjectID,
    StrToNSStr(key));
end;


// ------------------------------------------------------------------------------
function TMyUserDefaults.synchronize: boolean;
var
  UDefaults: NSUserDefaults;
begin
  try
    UDefaults := TNSUserDefaults.Wrap
      (TNSUserDefaults.OCClass.standardUserDefaults);
    Result := UDefaults.synchronize;
  except
    Result := False;
  end;
end;


// ------------------------------------------------------------------------------
function TMyUserDefaults.GetStringArrayValue(key: string): TArray<string>;
var
  UDefaults: NSUserDefaults;
  ar: NSArray;
  i: Integer;
begin
  if key = '' then
    exit;
  UDefaults := TNSUserDefaults.Wrap
    (TNSUserDefaults.OCClass.standardUserDefaults);


  ar := UDefaults.stringArrayForKey(StrToNSStr(key));
  SetLength(Result, ar.count);
  if ar.count = 0 then
    exit;
  for i := 0 to ar.count - 1 do
    Result[i] := UTF8ToString(TNSString.Wrap(ar.objectAtIndex(i)).UTF8String);


end;


// ------------------------------------------------------------------------------
{ TMyNSNotificationCenterHandler }
constructor TMyNSNotificationCenterHandler.create(ADPFUserDefaults
  : TMyUserDefaults);
begin
  inherited create;
  FMyUserDefaults := ADPFUserDefaults;
end;


// ------------------------------------------------------------------------------
function TMyNSNotificationCenterHandler.GetObjectiveCClass: PTypeInfo;
begin
  Result := TypeInfo(IMyNSNotificationCenterHandler);
end;


// ------------------------------------------------------------------------------
procedure TMyNSNotificationCenterHandler.defaultsChanged
  (notification: NSNotification);
begin
  if Assigned(FMyUserDefaults.FOnUserDefaultsChanged) then
    FMyUserDefaults.FOnUserDefaultsChanged(FMyUserDefaults);
end;


// ------------------------------------------------------------------------------
{$ENDIF}


end.


5、工程实例代码实现,把 my.iOS.NSUserDefaults文件填加到工程中

unit Unit1;


interface


uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, my.iOS.NSUserDefaults,
  FMX.StdCtrls, FMX.Edit, FMX.Controls.Presentation;


type
  TForm1 = class(TForm)
    edt1: TEdit;
    edt2: TEdit;
    swtch1: TSwitch;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    UserDefaults: TMyUserDefaults;
    procedure UserDefaultsChanged(sender: TObject);
  public
    { Public declarations }
  end;


var
  Form1: TForm1;


implementation


{$R *.fmx}


procedure TForm1.FormCreate(Sender: TObject);
begin
  UserDefaults := TMyUserDefaults.Create(nil);
  UserDefaults.OnUserDefaultsChanged := UserDefaultsChanged;
  UserDefaultsChanged(nil);
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(UserDefaults);
end;


procedure TForm1.UserDefaultsChanged(sender: TObject);
begin
  edt1.Text := UserDefaults.GetStringValue('param1', '');
  edt2.Text := UserDefaults.GetStringValue('param2', '');
  swtch1.IsChecked := UserDefaults.GetBooleanValue('param3');
end;


end.

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi for iOS开发指南 目录 Delphi XE4 For IOS真机调试配置教程 ........................................................................................................................... 3 Delphi for iOS开发指南(序):Delphi iOS应用程序开发 .............................................................................................. 63 Delphi for iOS开发指南(1):在Mac上配置你的开发环境 ............................................................................................ 70 Delphi for iOS开发指南(2):在Windows PC上配置你的开发环境 ............................................................................ 88 Delphi for iOS开发指南(3):创建一个FireMonkey iOS应用程序 ............................................................................ 100 Delphi for iOS开发指南(4):在iOS应用程序中使用不同风格的Button组件 .......................................................... 120 Delphi for iOS开发指南(5):在iOS应用程序中使用Calendar组件来选择日期 ...................................................... 129 Delphi for iOS开发指南(6):在iOS应用程序中使用ComboBox组件来从列表中选择某一项 ................................ 136 Delphi for iOS开发指南(7):在iOS应用程序中使用WebBrowser组件 .................................................................. 146 Delphi for iOS开发指南(8):在iOS应用程序中使用Tab组件来显示分页 ................................................................ 160 Delphi for iOS开发指南(9):在iOS应用程序中使用ListBox组件来显示TableView ............................................. 179 Delphi for iOS开发指南(10): 在iOS应用程序中使用Layout来调整窗体尺寸或排列方向 .................................... 205 Delphi for iOS开发指南(11):在iOS应用程序中拍照并共享照片 .............................................................................. 218 Delphi for iOS开发指南(12):在iOS Device中使用地理定位 ................................................................................... 230 Delphi for iOS开发指南(13):在iOS Device中使用通知中心 ................................................................................... 254 Delphi for iOS开发指南(14):在iOS应用程序中使用InterBase ToGo ................................................................... 283 Delphi for iOS开发指南(15):在iOS应用程序中使用SQLite ................................................................................... 311 Delphi for iOS开发指南(16):在iOS客户端应用程序中连接企业级数据库 ............................................................... 337 Delphi For iOS开发指南(17):让应用程序禁止竖屏(也就是只显示横屏) .................................................................... 360 Delphi For iOS开发指南(18):让Delphi XE4开发iOS应用显示为中文名称 ....................................................... 365 Delphi XE8实现移动端的消息推送(个推) .................................................................................................................... 373 Delphi XE10实现移动端支付宝支付接口(含源码) ....................................................................................................... 379 Delphi XE10实现移动端微信支付接口(含源码) ........................................................................................................... 401 Delphi XE10调用百度地图和百度导航 ......................................................................................................................... 429 Delphi XE10支持IOS IPV6的处理 ............................................................................................................................. 440

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值