рдЖрдИрдУрдПрд╕ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рдмреАрдд рдЪреБрдХрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдореБрдЭреЗ OS X рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдЕрдкрдирд╛ рд╣рд╛рде рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЦрд╛рд▓реА рд╕рдордп рдорд┐рд▓рд╛ред рдпрджрд┐ рдЖрдк рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ OS X рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЗ рд▓рд┐рдП рд╣реИ! рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рд╣реИ - рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкреНрд░рдмрдВрдзрдХред рд╕рднреА рд╕реНрд░реЛрдд
github.com/k06a/Clipshare рдкрд░
рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ

рд╣рдо рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ
рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╣рд┐рдЪрдХрд┐рдЪрд╛рд╣рдЯ рдХреЗ, рдореИрдВрдиреЗ Xcode 5 рдореЗрдВ
рдХреЛрдХреЛ рдПрдкреНрд▓реАрдХреЗрд╢рди рдХреЗ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ тАЬрдХреНрд▓рд┐рдкрд╢реЗрдпрд░тАЭ рдХрд╣рд╛ рдЧрдпрд╛ред рдирдП рд╕рд┐рд░реЗ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдлрд╝рд╛рдЗрд▓реЗрдВ
ABAppDelegate.h рдФрд░
ABAppDelegate.m рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд░реНрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╣рдо рдЕрдкрдирд╛ рд╕рд╛рд░рд╛ рдХреЛрдб рд▓рд┐рдЦреЗрдВрдЧреЗред
MainMenu.xib рдлрд╝рд╛рдЗрд▓ рдореЗрдВ
, рд╣рдо GUI рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбреНрд░рд╛ рдФрд░ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝ рдХрд░реЗрдВрдЧреЗред
рдзреНрдпрд╛рди рд╕реЗ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдЦрд┐рдбрд╝рдХреА рд░рд╣рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕реНрдерд┐рддрд┐ рдкрдЯреНрдЯреА (рдШрдбрд╝реА рдХреЗ рдкрд╛рд╕) рдореЗрдВ рд▓рдЯрдХрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рд╣реИ
рдореЗрдирдореЗрдиреБ.рдПрдХреНрд╕рд┐рдм рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдорд╛рдирдХ рдореЗрдиреВ рдмрд╛рд░ рдФрд░ рд╡рд┐рдВрдбреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдирд╛ - рд╣рдореЗрдВ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЕрдЧрд▓рд╛, 2 рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдореЗрдиреВ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ: рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдПрдХ рд╡рд┐рднрд╛рдЬрдХ рдФрд░ рдПрдХ рдирд┐рдХрд╛рд╕ рдмрд┐рдВрджреБред рдпрд╣ рдХреИрдирд╡рд╛рд╕ рдкрд░ рдмрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдФрд░ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдиреВ рдЖрдЗрдЯрдо рд╕реЗ
рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ Ctrl рдХреБрдВрдЬреА рджрдмрд╛рдП рд░рдЦреЗрдВ рдФрд░ рдореЗрдиреВ рдЖрдЗрдЯрдо рд╕реЗ
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдорд╛рдЙрд╕ рдХреЗ рд╕рд╛рде рдиреАрд▓реЗ рдзрд╛рдЧреЗ рдХреЛ рдЦреАрдВрдЪреЗрдВ:

рдорд╛рдЙрд╕ рдмрдЯрди рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ (рд╡рд┐рдзрд┐рдпреЛрдВ) рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдВрдбреЛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред рдкреНрд░рд╕реНрддреБрдд рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ,
-terminate
рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд
-terminate
:

рдЕрдм рдЖрдкрдХреЛ рдХреЛрдб рд╕реЗ рд╣рдорд╛рд░реЗ рдореЗрдиреВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред OS X рдХреА рд╕реНрдерд┐рддрд┐ рдкрдЯреНрдЯреА рдореЗрдВ рдЗрд╕рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдХрд┐рд╕ рд▓рд┐рдПред рд╕рд╣рд╛рдпрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рддрдм рдЦреЛрд▓реЗрдВ рдЬрдм Xcode рд╡рд┐рдВрдбреЛ рдореЗрдВ 2 рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕рд╣реА рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рд╣рдо рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЫреЛрдбрд╝реЗрдВрдЧреЗ, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрд░реЛрдд рдХреЛрдб
рдЪреБрдиреЗрдВрдЧреЗ :
ABAppDelegate.h ред рдФрд░ рдкрд┐рдЫрд▓реА рдмрд╛рд░ Ctrl рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреА рддрд░рд╣, рд╣рдо рдореЗрдиреВ рд╕реЗ рдиреАрд▓реЗ рдзрд╛рдЧреЗ рдХреЛ рдмрдврд╝рд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрдм рд╕реНрд░реЛрдд рдХреЛрдб рдкрд░ред рдЖрдкрдХреЛ
@interface
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ
@interface
рдХреЛрдб рд╕реЗрдХреНрд╢рди рддрдХ
@interface
(рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рд╕реЗ
рд╡рд┐рдВрдбреЛ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИ):

рдЬреИрд╕реЗ рд╣реА рд╣рдо рджрдмрд╛рдП рдЧрдП рдорд╛рдЙрд╕ рдмрдЯрди рдХреЛ рдЫреЛрдбрд╝рддреЗ рд╣реИрдВ, рдПрдХ рд╕рдВрд╡рд╛рдж рдмреЙрдХреНрд╕ рдирд┐рд░реНрдорд┐рдд
рдЖрдЙрдЯрд▓реЗрдЯ (рдХреЛрдб рдореЗрдВ рдПрдХ рдЧреБрдг рдЬреЛ GUI рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ) рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдкреЙрдк рдЕрдк рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдореЗрдиреВ":

рдЕрдм рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред рдлрд╝рд╛рдЗрд▓ рдореЗрдВ
ABAppDelegate.m рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ 1 рддрд░реАрдХрд╛ рд╣реИ рдФрд░ рдпрд╣ рдПрдХ рдЦрд╛рд▓реА рд╣реИ:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдЕрдВрджрд░, рдЙрд╕ рдХреЛрдб рдХреЛ рджрд░реНрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдкрд╣рд▓реЗ рд╣рдорд╛рд░реЗ рдореЗрдиреВ рдХреЛ OS X рд╕реНрдерд┐рддрд┐ рдкрдЯреНрдЯреА рдореЗрдВ рдмрд╛рдВрдзрддрд╛ рд╣реИ:
self.statusBar = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; self.statusBar.title = @"CS"; self.statusBar.menu = self.menu; self.statusBar.highlightMode = YES;
рдЗрд╕ рдХреЛрдб рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
@interface
рд╕реЗрдХреНрд╢рди рдореЗрдВ
@interface
рдкреНрд░реЙрдкрд░реНрдЯреА рднреА рдШреЛрд╖рд┐рдд рдХрд░рдиреА рд╣реЛрдЧреА:
@property (strong, nonatomic) NSStatusItem *statusBar;
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓
рдпрд╢ рдХреЗ рд╕рд╛рде 1 рд╕реЗ рд▓реЗрдХрд░
рдХреНрд▓рд┐рдкреНрд╕рд░реЗрд╢-рдЗрдиреНрдлреЛ.рдкреНрд▓реЗрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдХреБрдВрдЬреА рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдмрд┐рдирд╛ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:

рд╣рдо рдЕрдкрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ OS X рд╕реНрдЯреЗрдЯрд╕ рдмрд╛рд░ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдЗрд╕реЗ Cmd-Q рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛ рдХреЗрд╡рд▓ рдПрдХ рдореЗрдиреВ рдЖрдЗрдЯрдо рдкрд░ рдЯреИрдк рдХрд░рдХреЗ рднреА рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХрддреЗ рд╣реИрдВ:

рд╣рдо рдореВрд▓ рддрд░реНрдХ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ
рдореИрдВ рд╣рд░ рдЖрдзреЗ рд╕реЗрдХрдВрдб рдореЗрдВ рдЯрд╛рдЗрдорд░ рджреНрд╡рд╛рд░рд╛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдХреА рд╕рд╛рдордЧреНрд░реА рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рд╣рдо рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рдкрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рддреЗ рд╣реИрдВред рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдиреНрдп рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдПрдХ рджрдпрд╛ рд╣реИ (
stackoverflow.com/a/5033480/440168 )ред рдареАрдХ рд╣реИ, рдЯрд╛рдЗрдорд░ рд╕реЗрдЯ рдХрд░реЗрдВред рд╣рдо рдПрдХ рдЯрд╛рдЗрдорд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдпрд╣ рдмрддрд╛рдПрдВ рдХрд┐ рдХрд┐рд╕ рд╡рд┐рдзрд┐ рдФрд░ рдХрд┐рддрдиреА рдмрд╛рд░ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдореИрд╕реЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд▓реВрдк рдореЗрдВ рдЯрд╛рдЗрдорд░ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП:
NSTimer * timer = [NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(timerFire:) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
рдЕрдм, рдЯрд╛рдЗрдорд░ рд╕рдВрджреЗрд╢ рд▓реВрдк
self
рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдЪрдпрдирдХрд░реНрддрд╛ (рд╡рд┐рдзрд┐)
-timerFire:
рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛:
- (void)timerFire:(id)sender { NSPasteboard * pboard = [NSPasteboard generalPasteboard]; NSPasteboardItem * pboardItem = [[pboard pasteboardItems] lastObject]; NSString * text = [pboardItem stringForType:NSPasteboardTypeString]; // ... }
рд╡рд┐рдзрд┐ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ, рд╣рдо рдореБрдЦреНрдп рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдирд┐рд╣рд┐рдд рдЕрдВрддрд┐рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЗрд╕рдореЗрдВ рд╕реЗ рдкрд╛рда рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдорд╛рдиреЛрдВ рдХреА рд╕рд░рдгреА рдореЗрдВ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕рдорд╛рди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рддрд╛рд░реАрдЦ рдФрд░ рд╕рдордп рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рд╕рд░рдгреА (
ru.wikipedia.org/wiki/Parallel_array ) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВ:
@property (strong, nonatomic) NSMutableArray * texts; @property (strong, nonatomic) NSMutableArray * times;
рдЦрд╛рд▓реА рджреЗрдирджрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рджреЛрдиреЛрдВ рдЧреБрдгреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдордд рднреВрд▓рдирд╛:
self.texts = [NSMutableArray array]; self.times = [NSMutableArray array];
рдЕрдм рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо рдкрд┐рдЫрд▓реЗ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдореЗрдВ рдкрд╛рдП рдЧрдП рдкрд╛рда рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЕрдЧрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕рд░рдгреА рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдореЗрдиреВ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рдирдпрд╛ рдЖрдЗрдЯрдо рдЬреЛрдбрд╝реЗрдВ:
NSInteger index = [self.texts indexOfObject:text]; // ... NSMenuItem * menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:@selector(menuItemSelect:) keyEquivalent:@""]; [self.menu insertItem:menuItem atIndex:0]; [self.texts insertObject:text atIndex:0]; [self.times insertObject:[NSDate date] atIndex:0];
рдпрджрд┐ рдРрд╕рд╛ рдкрд╛рда рдкрд┐рдЫрд▓реЗ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ, рддреЛ рд╣рдо рдЕрдкрдиреЗ рдореЗрдиреВ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдЖрдЗрдЯрдо рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
BOOL
рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рдирдИ
selectedIndex
рд╕рдВрдкрддреНрддрд┐ рдмрдирд╛рдПрдБ:
if (index != NSNotFound) { self.selectedIndex = index; [self updateItemTitlesAndStates]; return; }
updateItemTitlesAndStates
рд╡рд┐рдзрд┐ рд╕рднреА рдореЗрдиреВ рдЖрдЗрдЯрдореЛрдВ рдХреЛ
updateItemTitlesAndStates
рдХрд░рддреА рд╣реИ рдФрд░ рдЙрдирдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреА рд╣реИ (рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдирд╛рдо рдЙрд╕ рд╕рдордп рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ) рдФрд░
updateItemTitlesAndStates
рдЖрдЗрдЯрдо рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдПрдХ рдЪреЗрдХрдорд╛рд░реНрдХ рдбрд╛рд▓реЗрдВ:
- (void)updateItemTitlesAndStates { for (int i = 0; i < self.menu.itemArray.count-2; i++) { NSDate * time = self.times[i]; NSString * text = self.texts[i]; NSMenuItem * menuItem = self.menu.itemArray[i]; NSString * timeStr = nil; NSTimeInterval secs = MAX(0,[[NSDate date] timeIntervalSinceDate:time]); if (secs < 60) timeStr = [NSString stringWithFormat:@"%ds",(int)(secs)]; else if (secs < 60*60) timeStr = [NSString stringWithFormat:@"%dm",(int)(secs/60)]; else if (secs < 60*60*24) timeStr = [NSString stringWithFormat:@"%dh",(int)(secs/60/60)]; else if (secs < 60*60*24*7) timeStr = [NSString stringWithFormat:@"%dd",(int)(secs/60/60/24)]; else if (secs < 60*60*24*365.75) timeStr = [NSString stringWithFormat:@"%dw",(int)(secs/60/60/24/7)]; else if (secs < 60*60*24*365.75*3) timeStr = [NSString stringWithFormat:@"%dM",(int)(secs/60/60/24/30.5)]; else if (secs < 60*60*24*365.75*100) timeStr = [NSString stringWithFormat:@"%dy",(int)(secs/60/60/24/365.75)]; else timeStr = @".."; menuItem.title = [NSString stringWithFormat:@"(%@) \"%@%@\"", timeStr, [text substringToIndex:MIN(MaxVisibleChars,text.length)], (text.length <= MaxVisibleChars) ? @"" : @"..."]; menuItem.state = (i == self.selectedIndex) ? NSOnState : NSOffState; menuItem.keyEquivalent = [@(i+1) description]; } }
рдпрджрд┐ рдЖрдк рдПрдХ рдирдпрд╛ рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЕрднреА рднреА рдкреБрд░рд╛рдиреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛, рдпрджрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рд╣реИрдВ:
while (self.menu.itemArray.count >= MaxVisibleItems+2) { [self.menu removeItemAtIndex:self.menu.itemArray.count-3]; [self.texts removeLastObject]; [self.times removeLastObject]; }
рдпрд╣ рдореЗрдиреВ рдЖрдЗрдЯрдо рдкрд░ рдХреНрд▓рд┐рдХ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ:
- (void)menuItemSelect:(id)sender { NSInteger index = [self.menu.itemArray indexOfObject:sender]; NSPasteboard * pboard = [NSPasteboard generalPasteboard]; [pboard clearContents]; NSPasteboardItem * pboardItem = [[NSPasteboardItem alloc] init]; [pboardItem setString:self.texts[index] forType:NSPasteboardTypeString]; [pboard writeObjects:@[pboardItem]]; }
рдЕрдм рдЖрд╡реЗрджрди рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдЬрдм рдкрд╛рда рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЪреЗрдХрдорд╛рд░реНрдХ рд╡рд╛рдВрдЫрд┐рдд рдЖрдЗрдЯрдо рдкрд░ рдХреВрдж рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рд╕реНрд╡рдпрдВ рдЗрд╕ рдордж рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╡рд╣реА рдмрд╛рдд рд╣реЛрддреА рд╣реИ:


рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреЗрд╡рд▓ рдкрд╛рда рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддрд╕реНрд╡реАрд░реЛрдВ, рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдареАрдХ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рдкрд╣рд▓рд╛ рдЖрд╡реЗрджрди рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдХреБрдЫ рдШрдВрдЯреЛрдВ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛ - рдЬрд┐рд╕рдХрд╛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╕рднреА рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдкрдврд╝рд╛ рдФрд░ рджреЗрдЦрд╛, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕рдХрд╛ рдЖрдирдВрдж рд▓рд┐рдпрд╛!
рдХреЛрдб рдореЗрдВ рдЬрд╛рджреВ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рдХрд┐рдХ рди рдХрд░реЗрдВ! рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдЖрд╕рд╛рди рдФрд░ рддреЗрдЬ рдерд╛, рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рд┐рдЦрд╛ рдерд╛ред рдХреМрди рдлреЗрдВрдЧ рд╢реБрдИ рдореЗрдВ рд╕рдм рдХреБрдЫ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИ - рдореИрдВ рдЖрдкрдХреЗ рдкреВрд▓ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ!
рдЖрд╡реЗрджрди рд╕реНрд░реЛрдд рдпрд╣рд╛рдВ
рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
github.com/k06a/Clipshareрдмрд╛рдЗрдирд░реА рдХреЛ рд░рд┐рд▓реАрдЬрд╝ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
github.com/k06a/Clipshare/releasesрдкреБрдирд╢реНрдЪ рдпрджрд┐ рдЖрдк рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рдХрдВрдЬреВрд╕реА рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рддреЛ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╣рдо iOS рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рд╣рдо рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдмреАрдЪ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░реЗрдВрдЧреЗ!
PPS рдЬреЛ рдХреЛрдИ рдкрд╛рда рдореЗрдВ рдПрдХ рдорд╣рд╛рдХрд╛рд╡реНрдп рдЯрд╛рдЗрдкреЛ рдкрд╛рддрд╛ рд╣реИ, рдЙрд╕реЗ рдХрд░реНрдо рдореЗрдВ рдкреНрд▓рд╕ рдорд┐рд▓реЗрдЧрд╛!